是否可以只使用SQL查詢沒有程序語言,將會在下面的格式輸出sql查詢打印ID:名稱映射
ID Name
-------------
1 a,b,c
2 x,y,z
3 m,n,l
我想這是打印類似下面
1:a
1:b
1:c
2:x
2:y
2:z
這是隻有我的SQL查詢是可能的,或者我必須使用UDF?
是否可以只使用SQL查詢沒有程序語言,將會在下面的格式輸出sql查詢打印ID:名稱映射
ID Name
-------------
1 a,b,c
2 x,y,z
3 m,n,l
我想這是打印類似下面
1:a
1:b
1:c
2:x
2:y
2:z
這是隻有我的SQL查詢是可能的,或者我必須使用UDF?
是你能夠 -
下的解決方案是Mysql
。
您可以使用SUBSTRING_INDEX
來反轉'group_concat'的過程。
這是你的SQL-
SELECT
id,
SUBSTRING_INDEX(SUBSTRING_INDEX(names, ',', n.d+1), ',', -1) name
FROM
users
INNER JOIN
(SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n
ON LENGTH(REPLACE(names, ',' , '')) <= LENGTH(names)-n.d
ORDER BY
id,
n.d
;WITH CTE(ID,Name)
AS
(
SELECT 1,'a,b,c' union all
SELECT 2,'x,y,z' union all
SELECT 3,'m,n,l'
)
SELECT ID, Split.a.value('.', 'VARCHAR(100)') AS Data
FROM
(
SELECT ID,
CAST ('<M>' + REPLACE(Name, ',', '</M><M>') + '</M>' AS XML) AS Data
from CTE
) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);
如果你想與輸出中 ':' separter,下面是代碼
;WITH CTE(ID,Name)
AS
(
SELECT 1,'a,b,c' union all
SELECT 2,'x,y,z' union all
SELECT 3,'m,n,l'
)
SELECT CONCAT(CAST(ID AS VARCHAR(5)),' : ', CAST(Data AS VARCHAR(5))) As [OutPut] From
(
SELECT ID, Split.a.value('.', 'VARCHAR(100)') AS Data
FROM
(
SELECT ID,
CAST ('<M>' + REPLACE(Name, ',', '</M><M>') + '</M>' AS XML) AS Data
from CTE
) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)
)Final
在SQL server
,你可以這樣做通過查詢CROSS APPLY
和xml query
DECLARE @SampleData AS TABLE (ID int IDENTITY (1,1), Name varchar(100))
INSERT INTO @SampleData (Name)
VALUES ('a,b,c'), ('x,y,z'), ('m,n,l')
;WITH temp AS
(
SELECT *,
CAST('<x>' + replace(sd.Name, ',', '</x><x>') + '</x>' AS xml) AS xmlText
FROM @SampleData sd
)
SELECT CONCAT(t.ID, ':',v.x.value('.','varchar(50)')) AS Result
FROM temp t
CROSS APPLY
t.xmlText.nodes('/x') AS v(x)
爲什麼'mysql'和'SQL-server'? – Wanderer
將數據保存爲csv非常糟糕db設計 – Jens
首先找出您正在使用的RDBMS。 – Strawberry