![](/img/trans.png)
[英]SQL Server equivalent of substring_index function in MySQL
[英]SUBSTRING_INDEX equivalent in SQL Server
桌子:
id | name
1 | a,b,c
2 | b
Output
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 服務器中,它拋出
[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'.
編輯:此查詢用於表格開發,其中 TSQL 未按預期工作
在 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);
您可以使用遞歸 CTE,如下所示
CREATE TABLE TBL(
Id INT,
String VARCHAR(45)
);
INSERT TBL VALUES
(1, 'a,b,c'),
(2, 'b');
WITH CTE(Id, Chr, String) AS
(
SELECT Id,
CAST(LEFT(String, CHARINDEX(',', String + ',') - 1) AS VARCHAR(20)),
STUFF(String, 1, CHARINDEX(',', String + ','), '')
FROM TBL
UNION ALL
SELECT Id,
CAST(LEFT(String, CHARINDEX(',', String + ',') - 1) AS VARCHAR(20)),
STUFF(String, 1, CHARINDEX(',', String + ','), '')
FROM CTE
WHERE String > ''
)
SELECT Id,
Chr
FROM CTE
ORDER BY Id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.