用另一个表中的ID替换由字符串分隔的列-SQL Server

时间:2018-11-13 23:31:17

标签: sql sql-server replace

我在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,但似乎找不到类似的东西。

1 个答案:

答案 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, '')

sqlfiddle