Предложение WHERE РАВНО NULL, НЕ РАВНО NOT NULL или NO WHERE в зависимости от значения параметра SQL Server
-
03-07-2019 - |
Вопрос
У меня есть хранимая процедура в SQL Server 2000, которая выполняет поиск на основе значений параметров.Для одного из переданных параметров мне нужен другой WHERE
предложение в зависимости от его значения - проблема в том, что 3 значения будут находиться там, где MyColumn
IS NULL
IS NOT NULL
ANY VALUE (NULL AND NOT NULL)
(по сути, нетWHERE
оговорка)
У меня какой-то ментальный блок в поиске правильного синтаксиса.Возможно ли это сделать в одном операторе select без выполнения некоторых IF @parameter BEGIN ... END
ветвление?
Решение
Вот как вы можете решить эту проблему, используя один WHERE
оговорка:
WHERE (@myParm = value1 AND MyColumn IS NULL)
OR (@myParm = value2 AND MyColumn IS NOT NULL)
OR (@myParm = value3)
Наивное использование прецедентного заявления не работает, под этим я подразумеваю следующее:
SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
WHEN value1 THEN MyColumn IS NULL
WHEN value2 THEN MyColumn IS NOT NULL
WHEN value3 THEN TRUE
END
Это можно решить с помощью инструкции case, см. onedaywhen ответ
Другие советы
Вы могли бы просто сделать что-то вроде этого:
SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)
Что-то в этом роде.
Вот как это можно сделать, используя CASE
:
DECLARE @myParam INT;
SET @myParam = 1;
SELECT *
FROM MyTable
WHERE 'T' = CASE @myParam
WHEN 1 THEN
CASE WHEN MyColumn IS NULL THEN 'T' END
WHEN 2 THEN
CASE WHEN MyColumn IS NOT NULL THEN 'T' END
WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn)
Если
@value
являетсяNULL
, он будет сравниватьMyColumn
к самому себе, игнорируя@value = no where
оговорка.ЕСЛИ
@value
имеет значение (NOT NULL
) это позволит сравнитьMyColumn
Для@value
.
Ссылка: ОБЪЕДИНЯТЬСЯ (Transact-SQL).
Другой способ РАССМОТРЕНИЯ ДЕЛА:
SELECT *
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL THEN 1
WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1
WHEN @myParm = value3 THEN 1
END
Я добился успеха с этим решением.Он почти как у Патрика, с небольшой изюминкой.Вы можете использовать эти выражения по отдельности или последовательно.Если параметр пустой, он будет проигнорирован и будут отображены все значения для столбца, который вы ищете, включая NULLS.
SELECT * FROM MyTable
WHERE
--check to see if @param1 exists, if @param1 is blank, return all
--records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
--where you want to search multiple columns using the same parameter
--enclose the first 'OR' expression in braces and enclose the entire
--expression
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
--if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')