Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > is null в предложении where


Автор: Cashey 12.10.2014, 18:56
Можно ли как то сделать подстановку в предложение WHERE когда (в зависимости от параметра) нужна конструкция field = @param или field is null

Конструкция field = @param or field is null не подходит, т.к. в этом случае всегда в выборке будут значения с null, а нужно исключительно или равные параметру или NULL, если @Param =0

Физически задачу решил конструкцие 
if @param = 0 
запрос с WHERE field is null
else
тот же самый запрос, но с WHERE  field = @param

но хотелось бы как-то покрасивее, а не писать два идентичных запроса


Автор: Zloxa 12.10.2014, 19:13
Цитата(Cashey @  12.10.2014,  19:56 Найти цитируемый пост)
Конструкция field = @param or field is null не подходит, т.к. в этом случае всегда в выборке будут значения с null, а нужно исключительно или равные параметру или NULL, если @Param =0

Код

 field = @param or field is null and @param is null

или же через http://msdn.microsoft.com/ru-ru/library/ms184325.aspx, http://msdn.microsoft.com/ru-ru/library/ms190349.aspx
Код

coalesce(field,0) = coalesce(@param,0)


Добавлено через 1 минуту и 25 секунд
ах, да, есть же еще http://msdn.microsoft.com/ru-ru/library/ms188048.aspx но он уже давно заявлен на деприкейт

Автор: bas 13.10.2014, 12:34
Case не поможет?

Автор: Akina 13.10.2014, 12:40
Всё одно плакали индексы, что с CASE, что с COALESCE...

Автор: Zloxa 13.10.2014, 14:03
Цитата(Akina @  13.10.2014,  13:40 Найти цитируемый пост)
Всё одно плакали индексы, что с CASE, что с COALESCE... 

Вобще самый ровный путь это таки "field = @param or field is null and @param is null". Если оптимайзер or не раскрывает, написать or через union all. Встречал случаи, когда оракл раскрыает nvl (аналог isnull), coalsesce, чему был очень приятно удивлен. Хотя is null в оракле это уже не по индексу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)