Sql 函数在字符串串联之间添加字符

Sql 函数在字符串串联之间添加字符,sql,sql-server,tsql,sql-server-2014,string-concatenation,Sql,Sql Server,Tsql,Sql Server 2014,String Concatenation,是否有一种更简单的方法在串联时在整个字符串中添加字符?我正在考虑使用一个函数来实现这一点,并且可以通过连接来实现;然而,除了串联之外,还有其他替代方法吗 这是我需要做的…有一个表A有8列,例如col1,col2,col3,等等 ;WITH TABLE_A AS ( SELECT 'ABC' AS Col1 , 'COM' AS Col2 , 'SMALL' AS Col3 , '1234' AS Col4 , 'A

是否有一种更简单的方法在串联时在整个字符串中添加字符?我正在考虑使用一个函数来实现这一点,并且可以通过连接来实现;然而,除了串联之外,还有其他替代方法吗

这是我需要做的…有一个表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之间的>,我需要用一个carrot^作为分隔符


有没有其他方法不使用CONCAT来实现这一点?可能是循环?

使用嵌套的
替换
交叉应用
。这将满足您在
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
s用于将空白字符串转换为NULL,以便在连接到NULL时消除分隔符。然后将这些空值转换回空白,以防止字符串的其余部分被删除。

我正在使用SQL Server 2014。concat_ws函数适用于SQL Server 2017及更高版本。@ItalianaStallion4215如果col4为null该怎么办。您是否仍然需要介于3和5之间的“^”。什么是col5是空的?我将更新我的答案以使用特定于版本的解决方案。否,如果Col5为空,则不需要胡萝卜,仅当Col4和Col5都有值时才使用胡萝卜。@ItalianaStallion4215已为SQL Server 2014更新。当col4或col5为空时,也会处理。我可以用3种不同的方式来完成这项任务,这与我所说的不同。。。“替换(替换(替换(替换)替换(替换(替换(ConConConConA.Col1,“a.Col1”,a.Col1,”>“a.Col1,a.Col1,”a.Col1,“替换(替换(ConConConC(a.Col1,””””””>,a.Col1,a.Col2,a.Col2,”>,a.Col2,”,a.Col1,a.Col1,“替换(替换)替换(替换)替换(替换)替换(ConC.Col1,a.Col1,a.Col1,a.Col1,”””>,a.Col1,a.Col1,”””>,,,,,“>”>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)+ISNULL(('>'+NULLIF)(a.Col6,),“”)+ISNULL(“>”+NULLIF(a.Col7,),”),“”)+ISNULL(“>”+NULLIF(a.Col8,),“”)作为[GUID_V2],CONCAT(ISNULL((NULLIF(a.Col1,),“”),ISNULL(“>”+NULLIF(a.Col2,),“”),ISNULL(“>”+NULLIF(a.Col3,),“”),ISNULL(“),ISNULL(“>”+NULLIF(a.Col4,”),“”),ISNULL(“),”),ISNULL(“>+NULLIF(a.Col2,”),”),“),”),iscol6,“),“”),ISNULL(“,”),“)(('>'+NULLIF(a.Col7',),''),ISNULL('>'+NULLIF(a.Col8',),'')作为[GUID_V3]