分割空格分隔的值

时间:2020-03-22 06:08:57

标签: 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   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')

2 个答案:

答案 0 :(得分:4)

首先,您需要使用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

然后在CROSS APPLY列中使用Arr

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

sqlfiddle

注意:

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

答案 1 :(得分:4)

您可以使用适用于 SQL Server 2016和更高版本STRING_SPLIT (Transact-SQL) 进行尝试。

create table tblSampleValue(Id int, Tag Varchar(10), Arr Varchar(50))
insert into tblSampleValue Values
(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')

Select * from tblSampleValue

select id
 , Tag
 , [value] as Arr 
from tblSampleValue 
cross apply string_split(Arr,' ')

实时db<>fiddle演示。