SQL Server - как использовать null и значение вместе в CASE THEN заявлении? - PullRequest
0 голосов
/ 09 сентября 2018

У меня проблема при использовании оператора CASE WHEN, потому что там, где столбец является строкой значения, необходимо использовать знак равенства, подобный этому

SELECT * 
FROM table
WHERE (field = (CASE WHEN @PaidStatus = 1 THEN 'HELLO' ELSE NULL END) 

но нулевое значение нельзя сравнить с оператором равенства (мне нужно написать WHERE field IS NULL, а не WHERE field = NULL).

Так как я мог это сделать?

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

Это сработает?

SELECT * 
FROM table
WHERE (field = 'HELLO' AND @PaidStatus = 1)
   OR (field IS NULL AND @PaidStatus <> 1)
0 голосов
/ 09 сентября 2018

Чтобы синтаксис с кейсом работал?
CASE возвращает значение и может иметь несколько WHEN.
Таким образом, вы можете сравнить с возвращенным значением.

SELECT * 
FROM table
WHERE 
(CASE 
 WHEN @PaidStatus = 1 AND field = 'HELLO' THEN 1
 WHEN field IS NULL THEN 2
 ELSE 0
 END) > 0

Что может быть удобно, если в CASE.
есть много разных критериев. Но если это только 2, то использование OR будет короче.

SELECT * 
FROM table
WHERE (field IS NULL OR (@PaidStatus = 1 AND field = 'HELLO'));
0 голосов
/ 09 сентября 2018

Чтобы вернуть только строки, где field = значение параметра, OR, все строки, если параметр имеет значение NULL, тогда:

SELECT * 
FROM table
WHERE (field = @PaidStatus OR @PaidStatus IS NULL)

для других комбинаций, таких как значение параметра равно 1, тогда поле равно 'HELLO' или всем строкам, если параметр равен нулю:

SELECT * 
FROM table
WHERE ((field = 'HELLO' AND @PaidStatus = 1) OR @PaidStatus IS NULL)

будьте осторожны с круглыми скобками, вы можете обнаружить, что отступы облегчают понимание, например

SELECT * 
FROM table
WHERE (
         (field = 'HELLO' AND @PaidStatus = 1) 
      OR (field = 'GOODBYE' AND @PaidStatus = 2) 
      OR @PaidStatus IS NULL
      )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...