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

2022-05-08 12:54:07 字數 1496 閱讀 1719

由於很多業務表因為歷史原因或者效能原因,都使用了違反第一正規化的設計模式,即同乙個列中儲存了多個屬性值。這種模式下,應用常常需要將這個列依據分隔符進行分割,並得到列轉行的結果:這裡使用substring_index函式進行處理

建表語句:

1

drop

table

ifexists

tbl_name;

2create

table

tbl_name(

3 id int(11) not

null

auto_increment,

4 username varchar(100) not

null,5

primary

key(id)6)

7 engine=innodb auto_increment=

2default charset=

utf8;89

insert

into tbl_name values (1,'

a,aa,aaa');

10insert

into tbl_name values (2,'

b,bb');

11insert

into tbl_name values (3,'

c,cc

');

如下圖:

sql語句:

1

select a.id,substring_index(substring_index(a.username,'

,',b.help_topic_id+

1),'

,',-

1) as

name

2from tbl_name a left

join

mysql.help_topic b

3on b.help_topic_id < (length(a.username)-length(replace(a.username,'

,',''))+1)

4order

by a.id;

執行結果:

分析如下:

length(a.username)-length(replace(a.username,'

,',''))+

1

表示了按逗號分割後,獲得行轉成列的數量,以下簡稱n;

根據id進行迴圈

id = id +

1}

總結:這種方法的缺點在於,我們需要乙個擁有連續數列的獨立表。並且連續數列的最大值一定要大於符合分割的值的個數。當然,mysql內部也有現成的連續數列表可用。如mysql.help_topic: help_topic_id 共有504個數值,一般能滿足於大部分需求了。

mysql逗號分隔List欄位轉多行

具體的邏輯我還沒整明白,先記上再說,親測可用。select a1.id,a1.job depends from job version history a1 where a1.id in 1655,1656 id job depends 1655 353,3,532 1656 484,5,567se...

Oracle欄位根據逗號分割查詢資料

需求是表裡的某個字段儲存的值是以逗號分隔開來的,要求根據分隔的每乙個值都能查出來資料,但是不能使用like查詢。資料是這樣的 查詢的sql如下 select from select guid,regexp substr st responsible,1,level responsible from ...

Oracle欄位根據逗號分割查詢資料的方法

需求是表裡的某個字段儲存的值是以逗號分隔開來的,要求根據分隔的每乙個值都能查出來資料,但是不能使用like查詢。資料是這樣的 查詢的sql如下 select from 程式設計客棧 select guid,regexp substr st responsible,1,level rwww.cppcn...