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系统只是时间问题。