我在SQL Server中有以下2个表
Category
表:
Category
--------------------------
Delivery;Gauges;Book;Table
Category id
:
id name
-----------------
13183 Delivery
88781 Gauges
88782 Book
12512 Table
预期结果是将类别表替换为类别ID,例如:
Category
-----------------------
13183;88781;88782;12512
我首先使用以下方法将类别列分为不同的列:
ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,依此类推。然后使用左连接并在每个新列上进行替换。有没有更简单的方法可以做到这一点?我在网上搜索了stackoverflow,但似乎找不到类似的东西。
答案 0 :(得分:0)
您可以尝试创建一个函数,以字符分隔字符串值。
CREATE FUNCTION Split_fun
( @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
RETURN
END
您可以使用此功能通过';'
来设置结果集。
与Category id
表进行自我联接。
最后,您可以使用FOR XML
用;
连接所有字符串以获得期望的结果。
;with cte as (
SELECT id
FROM T CROSS APPLY Split_fun(Category,';') v
JOIN T1 on v.word = t1.Category
)
select STUFF((
select distinct ';'+ cast(id as varchar(10))
FROM cte
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')