Оператор SQL IF с использованием нескольких ISNULL - PullRequest
0 голосов
/ 11 января 2019

У меня есть следующий код, который возвращает порядок посещения почтовых индексов. Я могу правильно вернуть почтовые индексы, но для того, чтобы сделать данные более удобными для пользователя, я добавил тире (-) между почтовыми индексами.

Проблема заключается в том, что я не могу понять, как устранить тире для строк, которые имеют только 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

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Следующий код будет вставлять разделители только для ненулевых значений. Предполагается, что столбцы заполняются слева направо.

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 голосов
/ 11 января 2019

Добавьте каждое значение через тире и удалите первый тире в результирующей строке, которая не обязательно совпадает с первой, используя stuff().

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

Примечание: я намеренно смешал + и concat() для объединения строк здесь. + приводит к NULL, когда значение равно NULL, но concat() обрабатывает NULL s как пустые строки. Таким образом, нам не нужно использовать много coalesce() s или isnull() s и т. Д.

0 голосов
/ 11 января 2019

SQL Server 2017 поддерживает CONCAT_WS, который предназначен для такого сценария:

CONCAT_WS игнорирует нулевые значения во время конкатенации и не добавляет разделитель между нулевыми значениями. Поэтому CONCAT_WS может чисто обрабатывать конкатенацию строк, которые могут иметь «пустые» значения - например, второе поле адреса

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

ДБ <> Fiddle demo

...