首页 > 解决方案 > 在字符串连接之间添加字符的函数

问题描述

有没有更简单的方法在连接时在整个字符串中添加字符?我正在考虑利用一个函数来做到这一点,并且可以通过连接来实现它;但是,除了连接之外,还有其他方法可以完成吗?

这是我需要做的......表 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 的替代方法?也许是一个循环?

标签: sqlsql-servertsqlsql-server-2014string-concatenation

解决方案


这是一个可行的示例,尽管它只进行了最少的验证来满足您的要求。

;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

NULLIFs 用于将空白字符串转换为 NULL,以便在连接到 NULL 时消除分隔符。然后将这些 NULL 转换回空白,以防止字符串的其余部分被消除。


推荐阅读