Функция для добавления символа между конкатенацией строк - PullRequest
0 голосов
/ 19 февраля 2020

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

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

;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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

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

;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 s используются для преобразования пустой строки в NULL, так что разделитель будет исключен при конкатенации в NULL. Затем эти NULL преобразуются обратно в пробелы, чтобы предотвратить удаление остальной части строки.

0 голосов
/ 19 февраля 2020

Использование 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

...