Есть ли более упрощенный способ добавления символов в строку во время объединения? Я подумываю об использовании функции для этого и могу достичь ее путем объединения; однако, есть ли какая-то альтернатива, которая может быть сделана, кроме конкатенации?

Вот что мне нужно сделать ... Есть таблица A, которая имеет 8 столбцов, для этого примера col1, col2, col3 и т. Д.

;WITH
 TABLE_A
 AS
 (
  SELECT 'ABC' AS Col1
         , 'COM' AS Col2
         , 'SMALL' AS Col3
         , '1234' AS Col4
         , 'ABC INC.' AS Col5
         , '123456789' AS Col6
         , 'ABC Of New England' AS Col7
         , 'NC123456' AS Col8
 )
  SELECT *
  FROM TABLE_A

Мне нужно объединить значения в столбцах с> между каждым. Я могу сделать это, делая что-то вроде ...

CONCAT(Col1,'>',Col2,'>',Col3,'>',Col4,'^',Col5,'>',Col6,'>',Col7,'>',Col8)

Но мне нужно, чтобы он был динамическим, поэтому, например, если col1 - Col3 имеет значение, то конкатенация должна выполняться только для тех CONCAT (Col1, '>', Col2, '>', Col3) и если Col1 - Col5 имеет значения затем CONCAT (Col1, '>', Col2, '>', Col3, '>', Col4, '^', Col5) и т. д., конкатенация должна идти только до тех пор, пока существуют значения.

Кроме того, чтобы добавить еще одну складку, вместо> между Col4 и Col5, мне нужно иметь символ моркови ^ в качестве разделителя.

Есть ли альтернативный способ сделать это без использования CONCAT? Может петля?

1
ItalianStallion4215 19 Фев 2020 в 00:55

2 ответа

Лучший ответ

Вот пример чего-то, что будет работать, хотя оно имеет только минимальную проверку для удовлетворения ваших требований.

;WITH
 TABLE_A
 AS
 (
  SELECT 'ABC' AS Col1
         , 'COM' AS Col2
         , 'SMALL' AS Col3
         , '1234' AS Col4
         , 'ABC INC.' AS Col5
         , '123456789' AS Col6
         , 'ABC Of New England' AS Col7
         , 'NC123456' AS Col8

 )
  SELECT ConcentenatedString = ISNULL(('>' + NULLIF(a.Col1,'')),'')
        +ISNULL(('>' + NULLIF(a.Col2,'')),'')
        +ISNULL(('>' + NULLIF(a.Col3,'')),'')
        +ISNULL(('>' + NULLIF(a.Col4,'')),'')
        +ISNULL(('^' + NULLIF(a.Col5,'')),'')
        +ISNULL(('>' + NULLIF(a.Col6,'')),'')
        +ISNULL(('>' + NULLIF(a.Col7,'')),'')
        +ISNULL(('>' + NULLIF(a.Col8,'')),'')
  FROM TABLE_A a

NULLIF используются для преобразования пустой строки в NULL, так что разделитель будет исключен при конкатенации в NULL. Эти NULL затем преобразуются обратно в пробелы, чтобы предотвратить удаление остальной части строки.

1
digital.aaron 18 Фев 2020 в 22:20

Использование cross apply с вложенным replace. Это позаботится о вашем требовании иметь ^ между col4 и col5, когда они не являются null, а также любым начальным символом >.

select case when left(txt,1)='>' then right(txt, len(txt)-1) else txt end as str
from your_table
cross apply  
(select replace(replace(replace(concat(col1,'>'
                                      ,col2,'>' 
                                      ,col3,'>'
                                      ,col4, case when col4 is not null and col5 is not null then '^' else '>' end
                                      ,col5,'>'
                                      ,col6,'>'
                                      ,col7,'>'
                                      ,col8),'>>>>','>'),'>>>','>'),'>>','>') as txt) t;

DEMO

0
Bilbo Baggins 19 Фев 2020 в 14:40