1. 程式人生 > >MySQL逗號分割欄位的行列轉換

MySQL逗號分割欄位的行列轉換

表資料:

ID Value
1 tiny,small,big
2 small,medium
3 tiny,big

期望得到結果:

ID Value
1 tiny
1 small
1 big
2 small
2 medium
3 tiny
3 big

正文:

複製程式碼
#需要處理的表
create table tbl_name (ID int ,mSize varchar(100));
insert into tbl_name values (1,'tiny,small,big');
insert into tbl_name values (2,'
small,medium'); insert into tbl_name values (3,'tiny,big'); #用於迴圈的自增表 create table incre_table (AutoIncreID int); insert into incre_table values (1); insert into incre_table values (2); insert into incre_table values (3);
複製程式碼 複製程式碼
select a.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),'
,',-1) from tbl_name a join incre_table b on b.AutoIncreID <= (length(a.mSize) - length(replace(a.mSize,',',''))+1) order by a.ID;
複製程式碼

原理分析:

這個join最基本原理是笛卡爾積。通過這個方式來實現迴圈。

以下是具體問題分析:

length(a.Size) - length(replace(a.mSize,',',''))+1  表示了,按照逗號分割後,改列擁有的數值數量,下面簡稱n

join過程的虛擬碼:

根據ID進行迴圈

{

判斷:i 是否 <= n

{

獲取最靠近第 i 個逗號之前的資料, 即 substring_index(substring_index(a.mSize,',',b.ID),',',-1)

i = i +1 

}

ID = ID +1 

}

總結:

這種方法的缺點在於,我們需要一個擁有連續數列的獨立表(這裡是incre_table)。並且連續數列的最大值一定要大於符合分割的值的個數。

例如有一行的mSize 有100個逗號分割的值,那麼我們的incre_table 就需要有至少100個連續行。

當然,mysql內部也有現成的連續數列表可用。如mysql.help_topic: help_topic_id 共有504個數值,一般能滿足於大部分需求了。

改寫後如下:

複製程式碼
select a.ID,substring_index(substring_index(a.mSize,',',b.help_topic_id+1),',',-1) 
from 
tbl_name a
join
mysql.help_topic b
on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1)
order by a.ID;
複製程式碼

相關推薦

MySQL逗號分割行列轉換

表資料: ID Value 1 tiny,small,big 2 small,medium 3 tiny,big 期望得到結果: ID Value 1 tiny 1 small 1 big 2 small 2 medium 3

MySQL逗號分割行列轉換技巧

create table tbl_name (ID int ,mSize varchar(100)); insert into tbl_name values (1,'tiny,small,big'); insert into tbl_name values (2,'small,medium'); inse

MySQL逗號分割字段的行列轉換技巧

sel 判斷 內部 rtm 至少 基本 分割 數據 tro SELECT GROUP_CONCAT(REPLACE(path,‘/‘,‘,‘)) AS path FROM department b WHERE department_type = 1 執行結果:

MySQL將一個中以逗號分隔的取出來形成新的

1例如:要把如圖1的欄位拆分圖2 select account_id, substring_index(substring_index(a.related_shop_ids,',' ,b.help_topic_id+1),',',-1) shopid

mysql查詢某的多條結果展示成按逗號隔開

mysql查詢某欄位的多條結果顯示成按逗號隔開有表:tel欄位:id tel 1 13578945620 2 13578945621 3 13578945622 4 13578945623 5 13578945624查詢tel欄位,出現的結果是這樣的:13578945620

mysql 查詢某個資訊,由多個id逗號隔開拼裝成

select a.SUPPLIER_USER_ID,GROUP_CONCAT(d.ITEM_NAME) AS countyName from p_supplier_user a LEFT JOIN t

mysql left join 逗號分隔查詢!

商品表 goods 有學校欄位 school_ids 學校欄位 school_ids 中儲存學校表 school 的id,如果商品包含多個學校則多個id使用逗號分隔儲存 goods: school: 查詢SQL: select g.id,g.school_id

MYSQL 查詢某中包含以逗號分隔的字串的記錄方法

表中有個欄位是以逗號間隔儲存的mineralidmineral11,4,3221,2要根據mineral查詢這個表的資料怎麼查詢呢select * from xxx where find_in_set(2,mineral);查詢結果是 :idmineral21,2那麼 fin

將以逗號隔開的轉換為對應字典值小記

首先是在工作中遇到了這樣一個需求,就是要將"01,02,03"轉化成為其對應的字典值並以逗號隔開。 查詢資料後 https://www.cnblogs.com/lovehersister/p/6090338.html 可將“01,02,03”轉化為列的形式。 這樣就可以用

如何用JAVA將二進位制檔案轉換成BASE64格式儲存到MySQL的Blob裡並讀出下載

由於需求要將上傳的檔案以BASE64的方式儲存到MySQL的Blob欄位,並可以讀取Blob欄位下載生成檔案,方法如下: 1、下載用於BASE64編碼轉換的sun.misc.BASE64Decoder

MySQL逗號分割字段的列轉行

需要 結果 post substring 由於 copy 結構 分割 sele 前言: 由於很多業務表因為歷史原因或者性能原因,都使用了違反第一範式的設計模式。即同一個列中存儲了多個屬性值(具體結構見下表)。 這種模式下,應用常常需要將這個列依據分隔符進行分割,並得到列轉行

Mysql查詢某個出現的次數並按倒序排列

問題:mysql資料庫表名address,查詢城市city欄位出現的次數並按倒序排列   查詢語句 select city,count(*) from address group by city order by count(*)  desc 執行結果如圖,按查詢欄位(城

mysql 關於某去重查詢

 使用distinct 和 group by 對於查詢多欄位,而只對一個欄位去重是查不到正確值得,因為distinct 後面跟多欄位,mysql會對只有這些子對完全重複才能去重,而group by 查詢的欄位也只能在 group 

mysql資料庫時間相差8個小時解決辦法

資料庫->mysql 持久層框架->mybatis 解決思路:使用mybatis提供的型別轉換器功能 建立DateHandler,指定泛型為Date package cn.nsu.edu.web.four.handler.mybatis; import org.ap

Mysql中 BLOB轉String的方法

轉:https://www.cnblogs.com/renjie0520/p/5242350.html 1.通過sql直接轉換 select CONVERT (*** USING utf8) AS userName from usertable; 2.通過程式轉換(注

MySQL中去除中的回車符和換行符

今天處理資料的時候,將Excel資料匯入MySQL後,通過SQL語句卻查不到需要的資料,後來找到一篇帖子解決了這個問題,原文地址:https://blog.csdn.net/u012586848/article/details/50997865,內容如下: 問題: 在使用【 load data

spring data jpa 查詢自定義轉換為自定義實體

目標:查詢資料庫中的欄位,然後轉換成 JSON 格式的資料,返回前臺。 環境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 entity 對映資料庫(非專業 java 不知道這怎麼說) @Entity @Tab

mysql】在mysql中更新的部分值,更新某個字串的部分內容

在mysql中更新欄位的部分值,更新某個字串欄位的部分內容   sql語句如下: update goods set img = REPLACE(img,'http://ozwm3lwui.bkt.clouddn.com','http://imgs.lqjava.com') where

JPA mysql中text的對映

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

mysql查詢表和的註釋

1,新建表以及新增表和欄位的註釋.   create table t_user(        ID INT(19) primary key auto_increment &nbs