【问题标题】:Function to add character between concatenation of strings在字符串连接之间添加字符的函数
【发布时间】:2020-06-03 00:16:02
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server tsql sql-server-2014 string-concatenation


    【解决方案1】:

    cross apply 与嵌套的replace 一起使用。当col4col5 不是null 以及任何前导> 字符时,这将满足您在col4col5 之间的要求。

    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

    【讨论】:

    • 我使用的是 SQL Server 2014。concat_ws 函数适用于 SQL Server 2017 及更高版本。
    • @ItalianStallion4215 如果 col4 为空怎么办。你还需要 3 到 5 之间的“^”吗?什么是 col5 为空?我将更新我的答案以使用特定于版本的解决方案。
    • 不,如果 Col5 为 null 则不需要胡萝卜,只有在 Col4 和 Col5 都有值时才使用它。
    • @ItalianStallion4215 已针对 SQL Server 2014 更新。当 col4 或 col5 为空时也会处理
    【解决方案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
    

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

    【讨论】:

    • 据我所知,我可以通过 3 种不同的方式完成这... REPLACE(REPLACE(CONCAT(a.Col1,'>',a.Col2,'>',a.Col3,' >',a.Col4,'^',a.Col5,'>',a.Col6,'>',a.Col7,'>',a.Col8),'>>',''),' ^>','>') AS [GUID_V1]
    • , 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,'')),'') AS [GUID_V2]
    • , CONCAT(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,'')),'')) AS [GUID_V3]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2021-12-26
    • 1970-01-01
    • 2020-03-03
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多