Нулевые и ненулевые значения в одном и том же параметре

#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)