2015-01-26 3 views
2

Я не могу понять, как использовать противоположное isnull или ifnull заявления в sql. Мне нужно сказать, что если a.Error1 не является нулевым - напечатайте ' - ' и + CHAR(13)+CHAR(10). В принципе, если a.Error1 возвращается к нулю, не должно быть тире или нет новой строки. Поэтому распечатайте информацию, если поле не равно нулю.using sql - не является нулевым в заявлении select

select a. .... 
' - ' + a.Error1 + CHAR(13)+CHAR(10) + 
' - ' + a.Error2 + CHAR(13)+CHAR(10) + 
' - ' + a.Error3 + CHAR(13)+CHAR(10) + 
' - ' + a.Error4 + CHAR(13)+CHAR(10) + 
' - ' + a.Error5 + CHAR(13)+CHAR(10) + 
' - ' + a.Error6      as 'error_message' 
... 
from table1 a 

Например, если для данной записи Error1, 2 и 5 вернулся выход я хотел бы выход быть следующим:
- Error1: Был ...
- Error2: ...
- Error5: Данные были ...

Если ошибок для этой строки не было, это должно быть пустое/пустое поле.

+0

возможно дубликат [Как сцепить столбцы правильно, используя T-SQL?] (Http://stackoverflow.com/questions/5235391/how-to-concatenate-columns-properly-using-t-sql) –

ответ

4

Вы можете использовать CASE:

SELECT a. .... 
     (CASE WHEN a.Error1 IS NOT NULL 
      THEN ' - ' + a.Error1 + CHAR(13)+CHAR(10) 
      ELSE '' 
     END) + 
     (CASE WHEN a.Error2 IS NOT NULL 
      THEN ' - ' + a.Error2 + CHAR(13)+CHAR(10) 
      ELSE '' 
     END) + 
     (CASE WHEN a.Error3 IS NOT NULL 
      THEN ' - ' + a.Error3 + CHAR(13)+CHAR(10) 
      ELSE '' 
     END) + 

    ...etc 
+0

Невозможно ли использовать что-то вроде оценки, если значение равно null? и вывод на печать на основе этого? Также есть вероятность, что для данной строки будет несколько ошибок, поэтому нам нужно, чтобы на выходе были ошибки error1 и error2 и т. Д. Мы не можем использовать случай, потому что после обнаружения одной ошибки другие случаи не будут оцениваться. – Elizabeth

+0

@ Elizabeth 'CASE' - это способ войти в' SQL Server'. Итак, если 'a.Error1' является нулевым, какой выход вы хотите? –

+0

Если a.Error1 является нулевым, просто пробел или пустое поле. В противном случае фактическое значение должно печатать (для всех ошибок) – Elizabeth

0
SELECT (CASE WHEN a.Error1 IS NOT NULL 
      THEN ' - ' + a.Error1 + CHAR(13)+CHAR(10) + 
      ELSE a.Error1 
      END) + 
     (CASE WHEN a.Error2 IS NOT NULL 
      THEN ' - ' + a.Error2 + CHAR(13)+CHAR(10) + 
      ELSE a.Error2 
      END) + 
    .....etc 
1

COALESCE функция делает то, что вы хотите здесь. Результатом COALESCE является первое значение NOT NULL, которое оно передается. Ниже мы используем '', который отличается от NULL, так что внешний + всегда применяется к NOT NULL строкам.

например.

select a. .... 
    COALESCE(' - ' + a.Error1 + CHAR(13)+CHAR(10), '') + 
    COALESCE(' - ' + a.Error2 + CHAR(13)+CHAR(10), '') + 
    COALESCE(' - ' + a.Error3 + CHAR(13)+CHAR(10), '') + 
    COALESCE(' - ' + a.Error4 + CHAR(13)+CHAR(10), '') + 
    COALESCE(' - ' + a.Error5 + CHAR(13)+CHAR(10), '') + 
    COALESCE(' - ' + a.Error6 , '') as 'error_message' 
... 
from table1 a 
+0

Вы должны объяснить, почему это работает и лучше, чем другие ответы, т. Е. Что конкатенация с NULL возвращает NULL –