【问题标题】:Another way to string_splitstring_split 的另一种方法
【发布时间】:2021-05-14 04:13:28
【问题描述】:

我有如下查询

SELECT vals.*
FROM table AS rels
INNER JOIN table AS vals ON vals.Id IN (
    SELECT value
    FROM STRING_SPLIT(rels.relatedID, ',')
)
WHERE rels.Id = 'x'

我想避免在这里使用STRING_SPLIT 方法。有什么办法吗?

【问题讨论】:

  • 为什么要避免使用STRING_SPLIT
  • 请将其与 SQL Server 的版本一起添加到您的问题中。
  • 这能回答你的问题吗? Alternative for String_split in SQL Server
  • 请停止为 SQL 添加 JavaScript sn-ps - 它们不起作用。
  • 我迷路了。为什么要使用自加入?样本数据和期望的结果会有所帮助。

标签: sql sql-server tsql


【解决方案1】:

你可以使用LIKE:

SELECT vals.*
FROM table rels INNER JOIN
     table vals
     ON CONCAT(',', rels.relatedID, ',') LIKE CONCAT('%,', vals.Id, ',%') 
WHERE rels.Id = 'x';

但是,您应该努力修复数据模型。在一个字符串列中存储多个值是在 SQL 数据库中存储数据的错误方式。

【讨论】:

    【解决方案2】:

    您可以创建如下功能。下面CTEf 是起始索引,t 是字符串的结束索引,每一个都由Delimiter 分隔。

    然后循环 CTE 并将 SUBSTRING 应用于您的原始字符串并返回结果。

    CREATE FUNCTION [dbo].[SplitString]    
    (
        @String nvarchar(max), 
        @Delimiter char(1)
    )
    RETURNS @t table (value nvarchar(max), sequence int)
    AS
    BEGIN
    
        SET @String += @Delimiter
    
        ;WITH a AS
        (
            SELECT CAST(1 AS bigint) f, CHARINDEX(@Delimiter, @String) t, 1 seq
            UNION ALL
            SELECT t + 1, CHARINDEX(@Delimiter, @String, t + 1), seq + 1
            FROM a
            WHERE CHARINDEX(@Delimiter, @String, t + 1) > 0
        )
        
        INSERT @t
        SELECT SUBSTRING(@String, f, t - f), seq 
        FROM a
        OPTION (maxrecursion 0)
        
        RETURN
        
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2013-02-10
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2017-03-19
      • 2020-08-02
      相关资源
      最近更新 更多