Почему поле пустое, когда я использую множественный регистр?

У меня есть этот код SQL:

SELECT (  P1.Name
    + (CASE P1.Vorname WHEN '' THEN '' ELSE ', ' + P1.Vorname END)
    + (CASE (AP1.Postleitzahl + AP1.Ort)
          WHEN '' THEN ''
          ELSE ' - ' + (AP1.Postleitzahl + AP1.Ort)
       END)
    + (CASE (PKT1.Kennung + PKM1.Kennung)
          WHEN ''
          THEN
             ''
          ELSE
               ' - '
             + (CASE PKT1.Kennung
                   WHEN '' THEN ''
                   ELSE 'Tel: ' + PKT1.Kennung
                END)
             + (CASE PKM1.Kennung
                   WHEN '' THEN ''
                   ELSE ' Mobil: ' + PKM1.Kennung
                END)
       END))
      AS [IO1] FROM XYZ

Теперь, когда одно поле не заполнено, ячейка пуста. Когда все заполнено данными, ячейка заполняется.

Так в чем проблема с этим кодом?

Я должен работать с MSSQL Server 2005, поэтому CONCAT или что-то еще не будет работать.


person benerawr    schedule 30.06.2014    source источник


Ответы (1)


Это ваш запрос:

SELECT (P1.Name +
        (CASE P1.Vorname WHEN '' THEN '' ELSE ', ' + P1.Vorname END) +
        (CASE (AP1.Postleitzahl + AP1.Ort) WHEN '' THEN '' ELSE ' - ' + (AP1.Postleitzahl + AP1.Ort) END) + 
        (CASE (PKT1.Kennung + PKM1.Kennung) WHEN '' THEN '' ELSE ' - ' + (CASE PKT1.Kennung WHEN '' THEN '' ELSE 'Tel: ' + PKT1.Kennung END) +
        (CASE PKM1.Kennung WHEN '' THEN '' ELSE ' Mobil: ' + PKM1.Kennung END) END)
       ) AS [IO1]
FROM XYZ;

Он выдаст NULL, если любой из аргументов равен NULL. Предположительно один или несколько столбцов NULL. Вы можете исправить это, обернув вещи в coalesce() и/или изменив операторы case. Например:

SELECT (coalesce(P1.Name, '') +
        (CASE WHEN P1.Vorname = '' or P1.Vorname is null THEN '' ELSE ', ' + P1.Vorname END) +
        (CASE WHEN (AP1.Postleitzahl + AP1.Ort) = '' or (AP1.Postleitzahl + AP1.Ort) is null THEN '' ELSE ' - ' + (AP1.Postleitzahl + AP1.Ort) END) + 
        (CASE WHEN (PKT1.Kennung + PKM1.Kennung) = '' or (PKT1.Kennung + PKM1.Kennung)  is null THEN '' ELSE ' - ' + (CASE WHEN PKT1.Kennung = '' or PKT1.Kennung  is null THEN '' ELSE 'Tel: ' + PKT1.Kennung END) +
        (CASE WHEN PKM1.Kennung  = '' or PKM1.Kennung is null THEN '' ELSE ' Mobil: ' + PKM1.Kennung END) END)
       ) AS [IO1]
FROM XYZ;
person Gordon Linoff    schedule 30.06.2014
comment
О, спасибо! Да, это очевидно, когда я смотрю на это сейчас. - person benerawr; 30.06.2014
comment
@benerawr не забудьте отметить этот ответ как реальный ответ, если он правильный. - person v.karbovnichy; 30.06.2014
comment
Я буду, но мне нужно подождать еще 2 минуты. ›_› - person benerawr; 30.06.2014