複数のISNULLを使用したSQL IF文

郵便番号が訪問された順序を返している以下のコードがあります。郵便番号を正しく返すことができますが、データをよりユーザーフレンドリーにするために、郵便番号の間にダッシュ( - )を追加しました。

問題は、郵便番号が2つか3つしかない行のダッシュを削除する方法がわからないという事実に由来します。

enter image description here

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
1

5 答え

SQL Server 2017は CONCAT_WS は次のようなシナリオ用に設計されています。

CONCAT_WSは、連結時にNULL値を無視し、NULL値間の区切り記号を追加しません。したがって、CONCAT_WSは、空白の値を持つ可能性がある文字列の連結、たとえば2番目のアドレスを明確に処理できます。フィールド

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

db<>fiddle demo

2
追加された
残念ながら、私はServer 2012を使用しています
追加された 著者 CH41-1P,

SQL Server 2017は CONCAT_WS は次のようなシナリオ用に設計されています。

CONCAT_WSは、連結時にNULL値を無視し、NULL値間の区切り記号を追加しません。したがって、CONCAT_WSは、空白の値を持つ可能性がある文字列の連結、たとえば2番目のアドレスを明確に処理できます。フィールド

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

db<>fiddle demo

2
追加された
残念ながら、私はServer 2012を使用しています
追加された 著者 CH41-1P,

次のコードは、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コードが使用されている土地ではそれほど混乱しないかもしれません。

0
追加された

stuff()を使用して、すべての値の前にダッシュを付け、結果の文字列の最初のダッシュを削除します。

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

注意:ここでは、文字列の連結に +concat()を意図的に混ぜています。値が NULL だが concat()NULL を扱う場合、 +NULL になります。空の文字列が好きです。こうすれば、たくさんの coalesce()isnull()などを使う必要がなくなります。

0
追加された

stuff()を使用して、すべての値の前にダッシュを付け、結果の文字列の最初のダッシュを削除します。

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

注意:ここでは、文字列の連結に +concat()を意図的に混ぜています。値が NULL だが concat()NULL を扱う場合、 +NULL になります。空の文字列が好きです。こうすれば、たくさんの coalesce()isnull()などを使う必要がなくなります。

0
追加された