#sql #sql-server-2008
#sql #sql-server-2008
Вопрос:
У меня есть это:
Decalre @param int
select * from table where param = @param
иногда пользователи хотели бы выбирать записи, где param равен null.
итак, что-то вроде этого:
if @param is null
begin
select * from table where param is null
end
else select * from table where param =@param
Возможно ли включить это в один запрос?
Ответ №1:
Должна быть возможность скрыть это в предложении where:
select * from table where (param =@param) or (param is null and @param is null)
Ответ №2:
Использовал бы coalesce для замены значения null, будет лучше влиять на производительность, чем or
я думаю :
SELECT *
FROM table
WHERE Coalesce(@param, 1) = Coalesce(param, 1)
Комментарии:
1. Вторым аргументом для объединения в каждом случае должно быть значение, которого нет в столбце param , в противном случае вы получите строки, в которых столбец param равен нулю или второму аргументу. Например: СОЗДАЙТЕ ТАБЛИЦУ #MyTable ([Param] int); ВСТАВЬТЕ В #MyTable ([Param]) ЗНАЧЕНИЯ (1); ВСТАВЬТЕ В #MyTable ([Param]) ЗНАЧЕНИЯ (2); ВСТАВЬТЕ В #MyTable ([Param]) ЗНАЧЕНИЯ ( NULL); ОБЪЯВИТЬ @param int; ВЫБРАТЬ * ИЗ #MyTable, ГДЕ COALESCE(@param, 1) = COALESCE([Param], 1); Результат: 1 NULL
2. Извините, stackoverflow удален форматирование было удалено из моего примера SQL в последнем комментарии 🙁
Ответ №3:
select
*
from table
where (@param is null AND param is null) OR (@param is not null AND param = @param)