在字符串连接之间添加字符的函数
Function to add character between concatenation of strings
有没有更简单的方法在串联时在整个字符串中添加字符?我正在考虑利用一个函数来做到这一点,并且可以通过串联来实现;但是,除了串联之外,还有其他方法可以完成吗?
这是我需要做的...Table 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 的替代方法?也许是循环?
将 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;
这是一个可行的示例,尽管它只需要最少的验证就可以满足您的要求。
;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 转换回空白,以防止字符串的其余部分被删除。
有没有更简单的方法在串联时在整个字符串中添加字符?我正在考虑利用一个函数来做到这一点,并且可以通过串联来实现;但是,除了串联之外,还有其他方法可以完成吗?
这是我需要做的...Table 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 的替代方法?也许是循环?
将 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;
这是一个可行的示例,尽管它只需要最少的验证就可以满足您的要求。
;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 转换回空白,以防止字符串的其余部分被删除。