【问题标题】:SQL IF Statement using multiple ISNULL使用多个 ISNULL 的 SQL IF 语句
【发布时间】:2019-06-06 19:03:03
【问题描述】:

我有下面的代码返回访问邮政编码的顺序。我能够正确返回邮政编码,但为了使数据更加用户友好,我在邮政编码之间添加了一个破折号(-)。

问题在于我无法弄清楚如何消除只有 2 或 3 个邮政编码的行的破折号。

SELECT 
    [Qry_Zip Stop Sequence].[Load ID], 
    [1] AS [Stop 1], [2] AS [Stop 2], [3] AS [Stop 3], 
    [4] AS [Stop 4], 
    TMS_Load.[Shipped Date/Time], 
    CONCAT(ISNULL([1], ''), '-', ISNULL([2], ''), '-', ISNULL([3], ''), '-', ISNULL([4], '')) AS [Zip to Zip w Stops]
FROM 
    (SELECT 
         [Load ID], [Sequence], [Stop Zip]
     FROM 
         TMS_Load_Stops) ls
PIVOT 
    (MIN([Stop Zip])
        FOR [Sequence] IN ([1], [2], [3], [4])) AS [Qry_Zip Stop Sequence]
INNER JOIN 
    [TMS_Load] ON [TMS_Load].[Load ID] = [Qry_Zip Stop Sequence].[Load ID]; 

我希望结果只显示有效邮政编码之间的破折号。

78052-45050-45201 or
73350-45220 or
84009-48009-14452 or
36521-38222-87745-95123 or
73368 or
12789-35789

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012 concat


    【解决方案1】:

    使用stuff() 在每个值前面加上一个破折号并删除结果字符串中的第一个破折号——不一定是第一个值中的那个破折号。

    stuff(concat('-' + [1],
                 '-' + [2],
                 '-' + [3],
                 '-' + [4]),
          1,
          1,
          '')
    

    注意:我故意在这里混合+concat() 进行字符串连接。当值为NULLconcat()NULLs 视为空字符串时,+ 会产生NULL。这样我们就不需要使用很多coalesce()s 或isnull()s 等。

    【讨论】:

      【解决方案2】:

      以下代码将仅为非 NULL 值插入分隔符。假设列是从左到右填充的。

      declare @Stops as Table ( Stop1 Char(5), Stop2 Char(5), Stop3 Char(5), Stop4 Char(5) );
      insert into @Stops ( Stop1, Stop2, Stop3, Stop4 ) values
        ( '00001', null, null, null ),
        ( '00001', '00002', null, null ),
        ( '00001', '00002', '00003', null ),
        ( '00001', '00002', '00003', '00004' );
      
      
      select Coalesce( Stop1, '' ) + Coalesce( '>' + Stop2, '' ) + Coalesce( '>' + Stop3, '' ) +
        Coalesce( '>' + Stop4, '' )
        from @Stops;
      

      除此之外:在使用 ZIP+4 代码的地区,除破折号以外的分隔符可能不会那么混乱。

      【讨论】:

        【解决方案3】:

        SQL Server 2017 支持CONCAT_WS,专为此类场景设计:

        CONCAT_WS 在连接过程中会忽略空值,并且不会在空值之间添加分隔符。因此,CONCAT_WS 可以干净地处理可能具有“空白”值的字符串的连接 - 例如,第二个地址字段

        SELECT *, CONCAT_WS('-', Stop1, Stop2, Stop3, Stop4) AS r
        FROM tab
        

        db<>fiddle demo

        【讨论】:

        • 不幸的是,我使用的是 Server 2012
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 2018-06-27
        • 2011-04-18
        相关资源
        最近更新 更多