【问题标题】:Insert line break into SQL query return after concatenating columns whilst skipping NULL values在连接列同时跳过 NULL 值后在 SQL 查询返回中插入换行符
【发布时间】:2017-03-20 10:29:50
【问题描述】:

我想将几列连接在一起,并在考虑NULL 值的情况下用换行符分隔每列返回。

比如我有如下数据表([dbo].[Address]):

Name         Address_line1    Address_line2   Address_line 3   Postcode
Mr Smith     1 Smith Street   NULL            Ireland          AB1 1CD
Mr Jones     1 Jones Road     Wales           NULL             EF2 3GH
Mrs White    1 White Way      England         UK               NULL

我想返回以下内容:

Name         Address
Mr Smith     1 Smith Street,
             Ireland,
             AB1 1CD
Mr Jones     1 Jones Road,
             Wales,
             EF2 3GH
Mrs White    1 White Way,
             England,
             UK

我该怎么做?

【问题讨论】:

  • 你可以在表现层处理这个

标签: sql sql-server concatenation


【解决方案1】:

你试过了吗?

select name,
       replace(stuff( coalesce('[sep]' + address_line1, '') +
                      coalesce('[sep]' + address_line2, '') +
                      coalesce('[sep]' + address_line3, ''),
                      1, 5, ''
                    ), '[sep]', '
'
               )
. . .

【讨论】:

    【解决方案2】:

    您可以使用+ 运算符和COALESCE() 的组合:

    WITH T AS (SELECT 'Mr Smith' AS NAME, '1 Smith Street' AS Address_Line1, NULL AS Address_line2, 'Ireland' AS Address_Line3, 'AB1 1CD' AS PostCode
    UNION SELECT 'Mr Jones' AS NAME, '1 Jones Road' AS Address_Line1, 'Wales' AS Address_line2, NULL AS Address_Line3, 'EF2 3GH' AS PostCode
    UNION SELECT 'Mrs White' AS NAME, '1 White Way' AS Address_Line1, 'England' AS Address_line2, 'UK' AS Address_Line3, NULL AS PostCode
    )
      SELECT NAME, ADDRESS_LINE1  
    + COALESCE(','+ CHAR(13)+CHAR(10)  + Address_line2 , '') 
    + COALESCE ',' + (CHAR(13)+CHAR(10)  +Address_line3 ,'')
    + COALESCE(',' + CHAR(13)+CHAR(10) +POSTCODE,'') AS ADDRESS
    FROM T
    

    输出:

    NAME      
    --------- --------------------------------------------
    Mr Jones  1 Jones Road,
       Wales,
       EF2 3GH
    Mr Smith  1 Smith Street,
       Ireland,
       AB1 1CD
    Mrs White 1 White Way,
       England,
       UK
    

    【讨论】:

    • 与字符的连接不会使空值不为空吗?
    • 不,但我必须编辑我的查询,因为我没有看到 POSTCODE 可以为 NULL,我必须消除挂起的 ','
    • 完成了。 @Stefano:在genere è il contrario:setenti di concatenare stringa con NULL, ottieni NULL。
    【解决方案3】:

    你可以用CHAR(13)点赞

    select Name, 
    Address_line1 + ',' +char(13) + Address_line2 + ',' + char(13) + Address_line 3 as address 
    from [dbo].[Address]
    

    【讨论】:

      【解决方案4】:

      我更喜欢将 ISNULL() 与 Char (13) + CHAR(10) 一起使用:

      SELECT 
      Name 
      , ISNULL(Address_line1 + ',' + CHAR(13)) + CHAR(10), '') + ISNULL(Address_line2 + ',' + CHAR(13)) + CHAR(10), '') + ISNULL(Address_line 3, '') as address 
      from [dbo].[Address]
      

      【讨论】:

        【解决方案5】:
        SELECT 
        name, 
        CONCAT(
        COALESCE(Address_line1,''), ', ', 
        COALESCE(Address_line2,''), ', ', 
        COALESCE(Address_line3,''), ', ', 
        COALESCE(Postcode,'')
        ) AS address 
        FROM table_name;
        

        【讨论】:

        • 请评论您提供的代码,帮助理解您的建议。
        猜你喜欢
        • 2015-11-30
        • 2021-02-15
        • 1970-01-01
        • 2017-06-02
        • 2021-12-27
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        相关资源
        最近更新 更多