Использование оператора Case в SQL с параметром / переменной для проверки значений Null - PullRequest
5 голосов
/ 19 ноября 2011

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

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

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

Ответы [ 7 ]

3 голосов
/ 19 ноября 2011

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

SELECT somefields
FROM sometable
WHERE
    (variable = 'blank' AND field IS NULL)
    OR (variable <> 'blank')
2 голосов
/ 19 ноября 2011

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

  • , когда @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
2 голосов
/ 19 ноября 2011

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

SELECT somefields
  FROM sometable
 WHERE field = NULLIF(variable, 'blank')
1 голос
/ 20 ноября 2011
SELECT somefields
FROM sometable
WHERE ((variable IS NULL OR variable = 0) OR (variable = field))

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

DECLARE @CityName VARCHAR(50)
SET @CityName = NULL

SELECT CityName
FROM City
WHERE ((@CityName IS NULL ) OR (@CityName = CityName ))

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

0 голосов
/ 06 ноября 2016

Вот мое решение, основанное на ответе @Andomar выше, предназначенное для всех, кто тестирует входное значение varchar, вам нужно протестировать параметр в правильном порядке, как показано в следующем примере:

FIELD1 = CASE
  WHEN @inputParameter = '' THEN FIELD1
  WHEN @inputParameter <> FIELD1 THEN NULL  -- if input is some text but does not match
  WHEN @inputParameter IS NULL THEN FIELD1
  WHEN @inputParameter != '' AND FIELD1 = @inputParameter THEN FIELD1
END

Надеюсь, это поможеткто-то.

0 голосов
/ 19 апреля 2012

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

    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 должен игнорироватьпеременная, если она равна нулю)

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

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

0 голосов
/ 19 ноября 2011

Я думаю, я понимаю, что вы после. Может быть, что-то подобное?

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