Соответствие BIT и DATETIME в операторе CASE - PullRequest
1 голос
/ 30 июня 2010

Я пытаюсь создать инструкцию T-SQL для фильтрации запроса по тому, является ли поле NULL или содержит ли оно значение.Было бы просто, если бы вы могли назначить NULL или NOT NULL как результат дела, но это не представляется возможным.

Вот psuedocode:

WHERE DateColumn = CASE @BitInput
   WHEN 0 THEN (all null dates)
   WHEN 1 THEN (any non-null date)
   WHEN NULL THEN (return all rows)

Из моегопонимание того, что условие WHEN 0 может быть достигнуто без предоставления условия WHEN (для возврата значения NULL).

Условие WHEN 1 выглядит так, как будто оно может использовать подстановочный знак, ноЯ получаю сообщение об ошибке преобразования типа.Присвоение столбцу самого себя исправляет это.

Я понятия не имею, что делать для условия WHEN NULL.Моя внутренняя логика, кажется, думает, что назначение столбца себе должно решить эту проблему, но это не так, как указано выше.

Я воссоздал это с использованием динамического SQL, но по разным причинам я бы предпочел, чтобы он был создан в нативномкод.

Буду признателен за любой ввод.Спасибо.

1 Ответ

2 голосов
/ 30 июня 2010

Выражение CASE (как сказал OMG Ponies) смешивает и сопоставляет типы данных (как вы заметили), кроме того, вы не можете сравнить с NULL, используя = или WHEN.

WHERE
   (@BitInput = 0 AND DateColumn IS NULL)
   OR
   (@BitInput = 1 AND DateColumn IS NOT NULL)
   OR
   @BitInput IS NULL

Вы, вероятно, могли бы написать это, используя CASE, но на самом деле вы хотите ИЛИ.

Вы также можете использовать IF..ELSE или UNION ALL, чтобы отделить 3 случая

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...