Sql 分割空间分隔值

Sql 分割空间分隔值,sql,sql-server,Sql,Sql Server,我有很多这样的唱片 ID Tag Arr 1 A 87 34 92 2 A 34 35 38 3 A 39 88 92 4 B 24 49 39 5 B 38 88 23 6 C 39 37 99 我希望最终结果以一种快速的方式看起来像这样 Tag Arr No A 87 1 A 34 2 A 92 2 A 35 1 A 38 1 A 39 1 A 88 1 B

我有很多这样的唱片

ID   Tag   Arr
1    A     87 34 92
2    A     34 35 38
3    A     39 88 92
4    B     24 49 39
5    B     38 88 23
6    C     39 37 99
我希望最终结果以一种快速的方式看起来像这样

Tag Arr No
A   87  1
A   34  2
A   92  2
A   35  1
A   38  1
A   39  1
A   88  1
B   24  1
B   49  1
B   39  1
B   38  1
B   88  1
B   23  1
C   39  1
C   37  1
C   99  1
这是我到目前为止构建的查询

SELECT DISTINCT T2.tag, 
    SUBSTRING(
        (
            SELECT ','+T1.Arr  AS [text()]
            FROM Tags T1
            WHERE T1.tag = T2.tag
            and filename = 1
            and tag not in ('U')
            ORDER BY T1.tag
            FOR XML PATH ('')
        ), 2, 1000) [Ts]
FROM Tags T2
WHERE  filename = 1
and tag not in ('U')

首先,您需要使用
Split
函数来拆分带有空格的
Arr

CREATE FUNCTION udf_Split 
( @Words nvarchar(MAX)
, @splitStr varchar(50) 
)
RETURNS @Result_Table TABLE
       (
         [word] nvarchar(max) NULL
       )
BEGIN 
    Declare @TempStr nvarchar(MAX)

    WHILE (CHARINDEX(@splitStr,@Words)>0)
    BEGIN
        Set @TempStr=SUBSTRING(@Words,1,CHARINDEX(@splitStr,@Words)-1)
        Insert into @Result_Table (word) Values (@TempStr)

        Set @Words = REPLACE(@Words,@TempStr+@splitStr,'')
    END/*End While*/

    IF(LEN(RTRIM(LTRIM(@Words)))>0 And CHARINDEX(@splitStr,RTRIM(LTRIM(@Words)))=0) 
    Begin
        Set @TempStr=@Words 

        Insert into @Result_Table (word) Values (@TempStr)

    End /*End IF*/

   RETURN 
END
然后将
交叉应用
Arr
列一起使用

SELECT Tag,
       word,
       count(*) [no]
FROM Tags CROSS APPLY udf_Split(Arr,' ') v
GROUP BY Tag,
       word
ORDER BY Tag

注意:


如果您的SQL server版本高于2016,您可以先使用一个官方函数,您需要使用
Split
函数来拆分
Arr
列,并留有空格

CREATE FUNCTION udf_Split 
( @Words nvarchar(MAX)
, @splitStr varchar(50) 
)
RETURNS @Result_Table TABLE
       (
         [word] nvarchar(max) NULL
       )
BEGIN 
    Declare @TempStr nvarchar(MAX)

    WHILE (CHARINDEX(@splitStr,@Words)>0)
    BEGIN
        Set @TempStr=SUBSTRING(@Words,1,CHARINDEX(@splitStr,@Words)-1)
        Insert into @Result_Table (word) Values (@TempStr)

        Set @Words = REPLACE(@Words,@TempStr+@splitStr,'')
    END/*End While*/

    IF(LEN(RTRIM(LTRIM(@Words)))>0 And CHARINDEX(@splitStr,RTRIM(LTRIM(@Words)))=0) 
    Begin
        Set @TempStr=@Words 

        Insert into @Result_Table (word) Values (@TempStr)

    End /*End IF*/

   RETURN 
END
然后将
交叉应用
Arr
列一起使用

SELECT Tag,
       word,
       count(*) [no]
FROM Tags CROSS APPLY udf_Split(Arr,' ') v
GROUP BY Tag,
       word
ORDER BY Tag

注意:

如果您的SQL server版本高于2016,您可以使用官方功能

,您可以使用适用于SQL server 2016及更高版本的功能尝试此功能

现场演示。

您可以使用适用于SQL Server 2016及更高版本的工具尝试此功能


现场演示。

您的查询有什么问题?您的查询有什么问题?在2020年,您可能会从最后一个注释开始;)到2020年,你可能会从最后一个音符开始;)很好的一个!!!我想微软将这个系统构建到他们的SQL Server系统只是时间问题。很好的一个!!!我想微软将其构建到SQL Server系统只是时间问题。