Использование битового ввода в хранимой процедуре для определения того, как фильтровать результаты в предложении where - PullRequest
3 голосов
/ 01 декабря 2011

Я бью себя головой об стену здесь ... не могу придумать, как это осуществить.

Вот мои настройки:

В моей таблице есть столбец длядата что-то было завершено.Если оно никогда не было заполнено, поле будет пустым.Достаточно просто.

На передней панели у меня есть флажок, который по умолчанию установлен на «Показывать только неполные записи».Когда тянут только неполные записи, это легко.

SELECT
    *
FROM Sometable
WHERE Completed_Date IS NULL

Но предложение флажка усложняет ситуацию.Мой флажок вводит битовое значение: 1 = показывать только неполное, 0 = показывать все.

Проблема в том, что я не могу использовать инструкцию CASE в предложении where, потому что фактическое значение использует "=" длясравнить, и проверка нуля использует "IS".Например:

SELECT
    *
FROM Sometable
WHERE Completed_Date IS   <---- invalid syntax
    CASE WHEN
        ...
    END


SELECT
    *
FROM Sometable
WHERE Completed_Date =
    CASE WHEN @OnlyIncomplete = 1 THEN
        NULL     <----- this translates to "WHERE Completed_Date = NULL", which won't work.. I have to use "IS NULL"
        ...
    END

Есть идеи, как решить эту, казалось бы, простую задачу?Я в тупике ... спасибо.

Ответы [ 3 ]

6 голосов
/ 01 декабря 2011
...
WHERE @OnlyIncomplete = 0
    OR (@OnlyIncomplete = 1 AND Completed_Date IS NULL)
0 голосов
/ 01 декабря 2011

Если вы все еще хотите использовать функцию CASE (хотя в этом случае она может быть излишней):

SELECT
    *
FROM Sometable
WHERE 1 = 
    (CASE WHEN @OnlyIncomplete = 0 THEN 1
          WHEN @OnlyIncomplete = 1 AND Completed_Date IS NULL THEN 1
     END)
0 голосов
/ 01 декабря 2011

Хммм ... Я думаю, что вы хотите, это:

SELECT
    *
FROM Sometable
WHERE Completed_Date IS NULL OR (@OnlyIncomplete = 0)

Так что покажет Date = NULL плюс, если OnlyIncomplete = 0, Date! = Null.Да, я думаю это все.

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