TSQL: NULL в предложении "IN" - PullRequest
       3

TSQL: NULL в предложении "IN"

3 голосов
/ 28 октября 2011

Мне нужно отфильтровать записи, где:

NotificationRead = 0 || NULL --> IF GetRead = 0
NotificationRead = 1 --> IF GetRead = 1
NotificationRead = 0 || 1 || NULL --> IF GetRead = NULL

Вот запрос, который я использую для этого:

DECLARE @GetRead BIT
DECLARE @Query VARCHAR(20)

SET @GetRead = NULL

IF @GetRead = 0 SET @Query = '0,NULL'
ELSE IF @GetRead = 1 SET @Query = '1'
ELSE SET @Query = '0,1,NULL'

SELECT * FROM vwNotifications  WHERE NotificationRead IN (@Query)

Приведенный выше запрос в основном не выполняется, когда я предоставляю NULL в предложении IN. Я знаю причину, по которой этот вопрос .

Но если я приму подход, предложенный в ответе на этот вопрос (используя NotificationRead IN (@Query) OR NotificationRead IS NULL), я получу все записи, где NotificationRead = NULL, когда они мне не нужны, например, когда @GetRead = 1

Не могли бы вы указать мне правильное направление здесь?

Ответы [ 3 ]

6 голосов
/ 28 октября 2011

Нет, проблема в том, что вы предоставляете значения в виде строк.

1 IN (1, 2) -- true.
1 IN ('1, 2') -- false.

Попробуйте вместо этого:

SELECT *
FROM vwNotifications 
WHERE (@GetRead = 0 AND (NotificationRead = 0 OR NotificationRead IS NULL))
OR    (@GetRead = 1 AND NotificationRead = 1)
OR    (@GetRead IS NULL AND (NotificationRead IN (0, 1) OR 
                             NotificationRead IS NULL))
2 голосов
/ 28 октября 2011

У других может быть лучший способ, но я бы переместил ваш выбор в каждое из операторов 'if' и изменил бы соответственно.

IF @GetRead = 0
    SELECT * FROM vwNotifications WHERE NotificationRead IS NULL or NotificationRead = 0
ELSE IF @GetRead = 1 
    SELECT * FROM vwNotifications WHERE NotificationRead = 1
ELSE
    SELECT * FROM vwNotifications WHERE NotificationRead IS NULL or NotificationRead in 0, 1

Примечание: пожалуйста, не используйте SELECT * в рабочем коде. Назовите ваши столбцы.

0 голосов
/ 28 октября 2011

Пара вариантов:

DECLARE @T TABLE (ID INT IDENTITY(1,1), Notify INT)
DECLARE @GetRead BIT
SET @GetRead = 0

INSERT INTO @T
        ( Notify )
VALUES  ( 0  -- Notify - int
          )

INSERT INTO @T
        ( Notify )
VALUES  ( 1  -- Notify - int
          )

INSERT INTO @T
        ( Notify )
VALUES  ( NULL  -- Notify - int
          )

SELECT *
FROM @t t
WHERE @GetRead IS NULL 
    OR (@GetRead = 0 AND (t.Notify =0 OR t.Notify IS NULL))
    OR (@getRead = 1 AND t.Notify = @GetRead)

SELECT *
FROM @t t
WHERE @GetRead IS NULL 
    OR ISNULL(t.notify, 0) = @GetRead
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...