SQL Server: CASE не работает - PullRequest
       1

SQL Server: CASE не работает

1 голос
/ 01 декабря 2011
SELECT 
   a.componentId, a.uniqueCode, 
   'sd'= CASE 
            WHEN RTRIM(LTRIM(b.name)) IS NULL OR RTRIM(LTRIM(b.uniqueCode)) IS NULL 
               THEN isnull(b.uniqueCode,'')+isnull(b.name,'') 
            WHEN RTRIM(LTRIM(b.name)) IS NULL AND RTRIM(LTRIM(b.uniqueCode)) IS NULL
               THEN isnull(b.uniqueCode,'')+isnull(b.name,'')
            ELSE b.uniqueCode + '(' + (b.name) + ')'
    END, 
    a.specialization 
FROM Doctors a 
LEFT OUTER JOIN Territories b ON a.locationId = b.componentId;

Предположим, b.uniqueCode = T003 и b.name = Dhanmondi 01, тогда sd должно быть T003(Dhanmondi 01).

Теперь, если b.name = NULL, тогда sd должно быть T003, но мой результат запроса показывает T003().

Что не так в моем запросе T-SQL?

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Вы уверены, что b.name - null? Если вместо null есть пустая строка, вы получите результат, который видите. Кстати, rtrim/ltrim абсолютно не требуется при проверке с is null, и ваш второй when никогда не произойдет, потому что вы всегда окажетесь в первом when, если любой из столбцов будет null.

Это будет рассматривать пустые строки как ноль:

SELECT a.componentId, a.uniqueCode, 'sd'=
        CASE 
            WHEN nullif(b.name, '') IS NULL OR nullif(b.uniqueCode, '') IS NULL 
            THEN isnull(b.uniqueCode,'')+isnull(b.name,'') 
            ELSE b.uniqueCode + '(' + (b.name) + ')'
        END , a.specialization 
FROM Doctors a LEFT OUTER JOIN Territories b ON a.locationId = b.componentId;
2 голосов
/ 01 декабря 2011

Давайте сначала разберемся с некоторыми основами ...

Ваш второй WHEN недоступен, так как более ранний WHEN всегда будет true (или ноль) перед вторым WHEN(оба null).

RTRIM() и LTRIM() вернут NULL только если аргумент NULL, поэтому эти два выражения условия идентичны:

  • RTRIM(LTRIM(b.name)) IS NULL
  • b.name IS NULL

Удаление избыточного кода, включая недоступный WHEN, позволит значительно упростить ваш код:

CASE
    WHEN b.name IS NULL OR b.uniqueCode IS NULL 
        THEN isnull(b.uniqueCode,'') + isnull(b.name,'')
    ELSE b.uniqueCode + '(' + b.name + ')'
END

Теперь, когдамы можем прочитать это ...

Наиболее вероятное объяснение состоит в том, что b.name пусто , а не NULL.

1 голос
/ 01 декабря 2011

В SQL и во всех популярных продуктах SQL - кроме Oracle - NULL и пустая строка '' - это две разные вещи.Таким образом, вы должны проверить оба варианта:

SELECT a.componentId, a.uniqueCode, 
    CASE 
        WHEN b.name IS NULL OR b.name = ''
            THEN COALESCE(b.uniqueCode, '')
        WHEN b.uniqueCode IS NULL OR b.uniqueCode = ''
            THEN b.name
            ELSE b.uniqueCode + '(' + b.name + ')'
    END AS sd
     , a.specialization 
...

или удалить начальные и конечные пробелы:

    CASE 
        WHEN b.name IS NULL OR RTRIM(LTRIM(b.name)) = ''
            THEN COALESCE(RTRIM(LTRIM(b.uniqueCode)), '')
        WHEN b.uniqueCode IS NULL OR RTRIM(LTRIM(b.uniqueCode)) = ''
            THEN RTRIM(LTRIM(b.name))
            ELSE RTRIM(LTRIM(b.uniqueCode)) + '(' 
               + RTRIM(LTRIM(b.name)) + ')'
    END AS sd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...