SQL Server 中的 SUBSTRING_INDEX 等效项

Posted

技术标签:

【中文标题】SQL Server 中的 SUBSTRING_INDEX 等效项【英文标题】:SUBSTRING_INDEX equivalent in SQL Server 【发布时间】:2020-07-22 21:09:18 【问题描述】:

表:

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'.

编辑:此查询用于 tableau 开发,其中 TSQL 未按预期工作

enter image description here

【问题讨论】:

这能回答你的问题吗? SQL Server equivalent of substring_index function in MySQL 对不起。虽然标题相似,但情况不同 MySQL 和 TSQL 是 SQL 的不同方言 显然,您需要将 MySQL 查询转换为 TSQL - 您没有明确表示的内容。但是使用正确规范化的表不会有这个问题 - 所以现在也许是修复架构的时候了。 【参考方案1】:

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

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

【讨论】:

我将 SUBSTRNG_INDEX 替换为 CROSS APPLY STRING_SPLIT。但这不起作用。它在关键字“CROSS”附近抛出 [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]不正确的语法。 [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]“数字”附近的语法不正确。 您的 SQL Server 版本是多少?也许是时候升级了。【参考方案2】:

试试这个:

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);

【讨论】:

我想用 MSSQL 数据库在 node express 项目中执行查询。所以需要MSSQL查询.. @RoopeshE 这是MSSQL 查询,但在引用Microsoft SQL Server 的SQL 方言时最好使用T-SQL K.但是你能提供这个 tsql 的等价物吗? 这肯定是一个有效的 T-SQL 语句。我已经将它写在我的 SSMS 上并执行了几次。【参考方案3】:

您可以使用递归 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;

Online demo

【讨论】:

感谢您的帮助。 Bt 我更新了我的问题。在这种情况下,TSQL 不是解决方案。因为我也需要将查询放在画面开发中。那里不工作。 @RoopeshE 那么为什么要首先标记 SQL Server? 抱歉错误。我找不到 mssql 标记名称。此外,数据库正在通过 sql server 访问......并且通常的查询在 sql server 中工作。

以上是关于SQL Server 中的 SUBSTRING_INDEX 等效项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sql server数据库中的标量值函数

sql SQL SERVER中的组连接

sql SQL Server中的常量

sqlserver之[SQL Server]缓冲池中的可用内存不足。[Microsoft][ODBC SQL Server Driver][SQL Server]语句已终止

在sql server2008中的日期类型是啥

如何查看sql server 2008的SQL语句执行错误日志