SQL Server中的SUBSTRING_INDEX等效项

问题描述 投票:0回答:2

表格:

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'.
mysql sql-server sql-server-2008 sql-server-2005
2个回答
0
投票

在SQL Server 2016及更高版本上,我们可以在此处使用STRING_SPLIT

SELECT id, value AS name  
FROM yourTable
CROSS APPLY STRING_SPLIT(name, ',')
ORDER BY id, value;

0
投票

尝试一下:

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);
© www.soinside.com 2019 - 2024. All rights reserved.