Использование case Statement в SQL с параметром / переменной для проверки значений Null

Я пытаюсь написать инструкцию SQL Select для возврата записей на основе ввода пользователем через интерфейс. Я хочу написать инструкцию Select следующим образом:

SELECT somefields FROM sometable WHERE CASE variable WHEN 'blank' THEN field IS NULL ELSE field = field END 

В принципе, я либо хочу отфильтровать столбец, чтобы найти значения NULL, либо игнорировать фильтр и вернуть все значения в зависимости от значения переменной. Я знаю, что результаты инструкции CASE не исполняются, но как я могу это сделать?

Когда variable является «пустой», следующий запрос даст вам строки, где field NULL. Когда variable есть что-то еще, она даст вам все строки:

 SELECT somefields FROM sometable WHERE (variable = 'blank' AND field IS NULL) OR (variable <> 'blank') 

Вы можете использовать NULLIF() (ссылка для SQL Server, но NULLIF() должна быть стандартной):

 SELECT somefields FROM sometable WHERE field = NULLIF(variable, 'blank') 

Следующий фрагмент должен вести себя следующим образом:

  • когда @variable is null , верните все строки
  • когда @variable = 'blank' , возвратите все строки, где field is null или field = 'blank'
  • в противном случае возвращать строки, где @variable равно field

Фрагмент кода:

 WHERE 1 = CASE WHEN @variable is null then 1 WHEN @variable = 'blank' and field is null then 1 WHEN @variable = field then 1 END 
 SELECT somefields FROM sometable WHERE ((variable IS NULL OR variable = 0) OR (variable = field)) 

WHERE Критерии применяются, когда переменная имеет значение
Например:

 DECLARE @CityName VARCHAR(50) SET @CityName = NULL SELECT CityName FROM City WHERE ((@CityName IS NULL ) OR (@CityName = CityName )) 

Когда City имеет значение null, таблицы возвращают все строки

Кажется, я понял, что тебе нужно. Что-то вроде этого, может быть?

 SELECT field1, field2, CASE variable WHEN 'blank' THEN NULL ELSE field3 END as field3 FROM sometable 

Подумайте, я понимаю, что вы имеете в виду … например ….

  SELECT House, Postcode from SomeTable where (House=isnull(@House,House) or (House is null and @House is null)) and (Postcode=isnull(@Postcode,Postcode) or (Postcode is null and @Postcode is null)) 

Первый бит условного выражения, где следует использовать переменную, если она присутствует (бит isnull должен игнорировать переменную, если она равна нулю)

Второй бит условного выражения, где на случай, если ваше оценочное поле равно null, а также как эффективно поля no = null, они равны нулю.

Смущенный? Хорошо. Работает над тем, что я делаю!