vasini Ответов: 7

SQL-запрос, передающий null и value в предложении where


У меня есть хранимая процедура с 2 входными параметрами. одно-это тип, а другое-институт.

Когда-нибудь институт может стать нулевым. Поэтому, если институт равен нулю, он не должен находиться в каком-либо состоянии.

Например, у меня должен быть запрос, как показано ниже. Могу ли я обойтись одним запросом? Не используя IF.

IF @type =1  and @Inst = 'abc'

Select * from Test
where Type = @type and Institute = @Inst 

If @type =1  and @Inst = null

Select * from Test
where Type = @type 


Мне нужен приведенный выше пример с одним выбором без использования IF coniditon. Разве это возможно?

Спасибо за вашу помощь.

Richard C Bishop

Вы можете использовать операторы case.

7 Ответов

Рейтинг:
60

ZurdoDev

Select * from Test
where Type = @type and (Institute = @Inst OR @Intst IS NULL)


vasini

Спасибо за ответ. Но он включает в себя записи, когда inst равен нулю. Мне нужно включить записи, когда его передали еще только условие с типом.

ZurdoDev

Я не совсем понимаю, что вы говорите, но я думаю, что это так: (Institute = @Inst или (@Intst-это NULL и @type = 1))

Рейтинг:
48

D.Nikolov

select * from Test
where Type = @type and 
(coalesce(@inst, 1) = 1  or Institute = @inst)


coalesce возвращает первый из своих аргументов, который не является нулевым, поэтому, когда @inst равен нулю, ваше условие будет похоже на Type = @type and (1=1 или Institute = null).
Случай, когда @inst имеет значение, будет Type = @type and ('abc' = 1 или Institute = 'abc').
Надеюсь, это поможет.


Рейтинг:
2

Davidduraisamy

Select * from Test
where Type = @type and (@Inst is null or Institute=@Inst)


D.Nikolov

Это проще, чем мое решение. Я бы использовал это, когда это возможно.

Рейтинг:
2

Web_Spider

Выберите * из теста
ГДЕ
Type = ISNULL(@type,type)
И Институт = ISNULL(@Inst,Institute)


jaket-cp

Этому вопросу уже более 2 лет, и не очень хорошая идея отвечать на старые вопросы.
И этот вопрос имеет общепринятое решение.
Кроме того, не похоже, что ваше решение получит то, что просил ОП.

Рейтинг:
2

Member 12071825

decalre @ins varchar(50)

если @ins = null
начать
@ins = "
конец


Выберите * из теста
где Type = @type и Institute like '%' + @ins + '%'

Я надеюсь, что это поможет вам !


Рейтинг:
1

gvprabu

Привет,

Проверьте следующие ссылки...

вы получите представление о NULL

Обработка Нулевых Значений [^]
Обработка нулевых значений в SQL Server 2005[^]
Нуль, нуль, нуль и ничего, кроме нуля.[^]
Нуль функции[^]
Головоломка – забава с нулем[^]

С уважением,
Гвпрабу


Рейтинг:
1

dpalash

Попробовать это.

DECLARE @UserName nvarchar(40), @Password nvarchar(10)

set @UserName='admin';
set @Password=null;

declare @sql nvarchar(4000);

set @sql='Select * from AdminUser where (';

if( @UserName is not NULL)
BEGIN
set @sql=@sql + ' UserName = '''+@UserName +'''';
END

if( @Password is not NULL)
BEGIN
if( @Password is not NULL)
set @sql=@sql + ' and Password = '''+@Password +'''';
END

set @sql=@sql + ')';

print @sql
exec sp_executesql @sql


Счастливое Кодирование :)