表格:
id | name
1 | a,b,c
2 | b
输出
id | name
1 | a
1 | b
1 | c
2 | b
我在网上找到了此查询,并且在mySql Phpmyadmin查询编辑器中工作正常。
SELECT
tablename.id, SUBSTRING_INDEX(SUBSTRING_INDEX (tablename.name, ',', numbers.n), ',', - 1) NAME
FROM (SELECT 1 n UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4) numbers
INNER JOIN tablename
ON CHAR_LENGTH (tablename.name) - CHAR_LENGTH (REPLACE (tablename.name, ',', '')) >= numbers.n - 1
ORDER BY id, n
但是在SQL Server中,它会抛出
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'SUBSTRING_INDEX' is not a recognized built-in function name.
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near 'numbers'.
在SQL Server 2016及更高版本上,我们可以在此处使用STRING_SPLIT
:
SELECT id, value AS name
FROM yourTable
CROSS APPLY STRING_SPLIT(name, ',')
ORDER BY id, value;
尝试一下:
DECLARE @DataSource TABLE
(
[ID] INT
,[name] VARCHAR(24)
);
INSERT INTO @DataSource ([ID], [Name])
VALUES (1, 'a,b,c')
,(2, 'b');
WITH DataSource ([ID], [nameXML]) AS
(
SELECT [ID]
,CAST('<a>' + REPLACE([name], ',', '</a><a>')+ '</a>' AS XML)
FROM @DataSource
)
SELECT [ID]
,T.c.value('.', 'VARCHAR(100)')
FROM DataSource DS
CROSS APPLY [nameXML].nodes('./a') T(c);