Заменить столбцы, разделенные строкой с идентификатором из другой таблицы - SQL Server - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть следующие 2 таблицы в SQL Server

Category таблица:

Category
--------------------------
Delivery;Gauges;Book;Table

Category id:

id      name
-----------------
13183   Delivery
88781   Gauges
88782   Book
12512   Table

Предполагаемый результат для категорииТаблица заменена на идентификатор категории, как:

Category
-----------------------
13183;88781;88782;12512

Я подошел к этому, сначала разделив столбцы категории на отдельные столбцы, используя:

ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))

и так далее.Затем используется левое соединение и замена на каждом новом столбце.Нет ли более простого способа сделать это?Я искал в сети и stackoverflow, но не могу найти ничего подобного.

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете попытаться создать функцию для разделения вашего строкового значения на символ.

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 таблицей.

final вы можете использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...