由於很多業務表因為歷史原因或者效能原因,都使用了違反第一正規化的設計模式,即同乙個列中儲存了多個屬性值。這種模式下,應用常常需要將這個列依據分隔符進行分割,並得到列轉行的結果:這裡使用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,'表示了按逗號分割後,獲得行轉成列的數量,以下簡稱n;,',''))+
1
根據id進行迴圈總結:這種方法的缺點在於,我們需要乙個擁有連續數列的獨立表。並且連續數列的最大值一定要大於符合分割的值的個數。當然,mysql內部也有現成的連續數列表可用。如mysql.help_topic: help_topic_id 共有504個數值,一般能滿足於大部分需求了。id = id +
1}
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...