[英]Separate comma separated list into query columns
我有一個表,其中的列包含逗號分隔的列表,例如
ID : List
1 : 1,2,44,5 --row# 1
2 : 4,3,5,2,56,66 --row# 2
等等。 我想編寫一個選擇查詢,該查詢最多具有10列Item1,Item2,Item3...。Item10,並且每一列都有對應的逗號分隔列表中的一個數字。
例如:對於ID = 1
Item1 = 1, Item2 = 2, Item3 = 44, Item4 = 55 and all other columns would be null or empty
如何用SQL編寫?
您可以這樣做:
select
substring_index(substring_index(str,',',1),',',-1)AS c1
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 1 THEN substring_index(substring_index(str,',',2),',',-1) ELSE NULL END AS c2
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 2 THEN substring_index(substring_index(str,',',3),',',-1) ELSE NULL END AS c3
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 3 THEN substring_index(substring_index(str,',',4),',',-1) ELSE NULL END AS c4
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 4 THEN substring_index(substring_index(str,',',5),',',-1) ELSE NULL END AS c5
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 5 THEN substring_index(substring_index(str,',',6),',',-1) ELSE NULL END AS c6
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 6 THEN substring_index(substring_index(str,',',7),',',-1) ELSE NULL END AS c7
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 7 THEN substring_index(substring_index(str,',',8),',',-1) ELSE NULL END AS c8
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 8 THEN substring_index(substring_index(str,',',9),',',-1) ELSE NULL END AS c9
, CASE WHEN LENGTH(str)-LENGTH(REPLACE(str,',','')) >= 9 THEN substring_index(substring_index(str,',',10),',',-1) ELSE NULL END AS c10
from test
表達式有兩個共同的部分:
LENGTH(str)-LENGTH(REPLACE(str,',','')) >= K
此子表達式確定字符串是否至少具有K
定界符 substring_index(substring_index(str,',',K),',',-1)
-此子表達式在第K
個定界符后切出元素 這可以通過從MySQL Split String Function
創建用戶定義的函數引用來完成,將包含逗號分隔字符串的列作為第一個參數傳遞給此函數,在第二個參數中傳遞分隔符(如果您的情況是逗號,在第三個參數中傳遞)通過您想要的位置以獲取字符串
SPLIT_STR(字符串,分隔符,位置)
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
然后您可以在下面查詢數據
SELECT
SPLIT_STR(List, ',', 1) item1,
SPLIT_STR(List, ',', 2) item2,
SPLIT_STR(List, ',', 3) item3,
SPLIT_STR(List, ',', 4) item4,
SPLIT_STR(List, ',', 5) item5,
SPLIT_STR(List, ',', 6) item6,
SPLIT_STR(List, ',', 7) item7,
SPLIT_STR(List, ',', 8) item8,
SPLIT_STR(List, ',', 9) item9,
SPLIT_STR(List, ',', 10) item10
FROM t
Fiddle Demo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.