使用多个ISNULL的SQL IF语句

使用多个ISNULL的SQL IF语句,sql,sql-server,tsql,sql-server-2012,concat,Sql,Sql Server,Tsql,Sql Server 2012,Concat,我有下面的代码,返回访问邮政编码的订单。我能够正确返回邮政编码,但为了使数据更方便用户,我在邮政编码之间添加了一个破折号(-) 问题来自这样一个事实,即我无法找出如何消除只有2或3个邮政编码的行的破折号 我希望结果只显示有效邮政编码之间的破折号 78052-45050-45201 or 73350-45220 or 84009-48009-14452 or 36521-38222-87745-95123 or 73368 or 12789-35789 SQL Server 2017支持针对此

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

问题来自这样一个事实,即我无法找出如何消除只有2或3个邮政编码的行的破折号

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

78052-45050-45201 or
73350-45220 or
84009-48009-14452 or
36521-38222-87745-95123 or
73368 or
12789-35789
SQL Server 2017支持针对此类场景而设计的:

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


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

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代码的区域中,除破折号以外的分隔符可能不太容易混淆。

在每个值前面加破折号,然后使用
stuff()
删除结果字符串中的第一个破折号,而不一定是第一个值中的破折号


注意:我特意将
+
concat()
混合在一起用于字符串连接<当值为
NULL
concat()
NULL
视为空字符串时,code>+会导致
NULL
。这样我们就不需要使用太多的
coalesce()
s或
isnull()
s等。不幸的是,我使用的是Server 2012
SELECT *, CONCAT_WS('-', Stop1, Stop2, Stop3, Stop4) AS r
FROM tab
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;
stuff(concat('-' + [1],
             '-' + [2],
             '-' + [3],
             '-' + [4]),
      1,
      1,
      '')