Преобразовать разделенные точкой с запятой коды в столбце в их значения SQL - PullRequest
0 голосов
/ 04 мая 2020

Я знаю, что это идет вразрез со всеми принципами нормализации БД, но я не могу изменить дизайн на этом этапе.

У меня есть столбец, значения которого хранятся следующим образом (SQL База данных сервера):

5;26;31;49

Есть еще одна таблица, в которой есть перевод для этих значений, который выглядит следующим образом:

Code   Value
-------------------
5      Some Value 1
26     Some Value 2
31     Some Value 3
49     Some Value 4

Мне нужно преобразовать коды, разделенные точкой с запятой, в их соответствующие значения и представить эти значения как часть только одной строки, так что я хочу видеть в результате:

Some Value 1; Some Value 2; Some Value 3; Some Value 4

У кого-нибудь есть решение этой головоломки?

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

В самых последних версиях SQL Server вы можете использовать string_split() и string_agg():

select t.*, v.expanded
from t cross apply
     (select string_agg(c.value, ';') within group (order by charindex(c.code, t.codes) as expanded
      from string_split(t.codes, ';') join
           codes c
           on c.code = s.value
     ) v;
1 голос
/ 04 мая 2020

Используйте string_split, если вы используете SQLSERVER, который транспонирует строку в столбец. Набор результатов можно использовать как таблицу и объединить с любой таблицей в БД для желаемого результата.

declare @str VARCHAR(20)= '5;26;31;49'
 (SELECT VALUE FROM string_split(@str,';'));

Когда два таблицы объединяются, результат будет выглядеть следующим образом:

 select tablB.value from 
 (SELECT VALUE as code FROM string_split(tableA.col,';')) transposed_table,
 tableB 
 where transposed_table.code = tableB.code

. Вы можете использовать курсор на l oop through для переноса вывода в строку, как показано ниже,

DECLARE @codevalues VARCHAR(max) = '';
DECLARE @codevalue VARCHAR(20)= '';

DECLARE db_cursor CURSOR FOR
  select tablB.value+';' from 
  (SELECT VALUE as code FROM string_split(tableA.col,';')) transposed_table,
  tableB 
  where transposed_table.code = tableB.code;

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @codevalue
WHILE @@FETCH_STATUS = 0
BEGIN
      set @codevalues = @codevalues+@codevalue;
      FETCH NEXT FROM db_cursor INTO @codevalue

END

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