2017-04-26 104 views
0

是否可以只使用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?

+2

爲什麼'mysql'和'SQL-server'? – Wanderer

+3

將數據保存爲csv非常糟糕db設計 – Jens

+1

首先找出您正在使用的RDBMS。 – Strawberry

回答

0

是你能夠 -

下的解決方案是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 
0
;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 
0

SQL server,你可以這樣做通過查詢CROSS APPLYxml 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) 

演示鏈接:http://rextester.com/IHQF16100