Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как запихать IN в CASE  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
Надо выполнить нечто такое:


declare @i varchar(5)
set @i = 'xxx'

select * from mytable 
where myfield in case @i when 'xxx' then (124, 555) else (678, 999) end


т.е. в зависимости от параметра, myfield должен просматривать разные списки IN, можно-ли как-нибудь такое сделать?
17 сен 13, 10:51    [14847864]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
как то так
Guest
как то так

declare @i varchar(5)
set @i = 'xxx'

select * from mytable 
where 
	(
		1 = case when @i = 'xxx' then 1 else 0 end
		and myfield in (124, 555)
	)
	or (
		0 = case when @i = 'xxx' then 1 else 0 end
		and myfield in (678, 999)
	)
17 сен 13, 10:54    [14847882]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Glory
Member

Откуда:
Сообщений: 104751
stenford
т.е. в зависимости от параметра, myfield должен просматривать разные списки IN, можно-ли как-нибудь такое сделать?

Сделать из "списков" таблицу. На крайний случай - табличную функцию или представление
17 сен 13, 10:56    [14847900]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
stenford
Надо выполнить нечто такое:


declare @i varchar(5)
set @i = 'xxx'

select * from mytable 
where myfield in case @i when 'xxx' then (124, 555) else (678, 999) end


т.е. в зависимости от параметра, myfield должен просматривать разные списки IN, можно-ли как-нибудь такое сделать?
select * from mytable 
where 1=case 
  when @i ='xxx' and myfield in (124, 555) then 1 
  when myfield in (678, 999) then 1 
  end
17 сен 13, 10:59    [14847924]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
declare @i varchar(5)
set @i = 'xxx'

select * from mytable 
where 
	(
	@i = 'xxx' and myfield in (124, 555)
	)
	or (
		(@i <> 'xxx' or @i is null )
		and myfield in (678, 999)
	)

ну и таблица с двумя столбцами значения @i и значения myfield тоже хорошо
17 сен 13, 11:03    [14847944]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
Cygapb-007
stenford
Надо выполнить нечто такое:


declare @i varchar(5)
set @i = 'xxx'

select * from mytable 
where myfield in case @i when 'xxx' then (124, 555) else (678, 999) end


т.е. в зависимости от параметра, myfield должен просматривать разные списки IN, можно-ли как-нибудь такое сделать?
select * from mytable 
where 1=case 
  when @i ='xxx' and myfield in (124, 555) then 1 
  when myfield in (678, 999) then 1 
  end


всем спасибо, этот вариант мне больше всего понравился
17 сен 13, 11:09    [14847987]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Glory
Member

Откуда:
Сообщений: 104751
stenford
всем спасибо, этот вариант мне больше всего понравился

А серверу - меньше всего
17 сен 13, 11:11    [14848003]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
stenford
всем спасибо, этот вариант мне больше всего понравился

Ну вы понимаете, что если у вас есть индекс по myfield, то в таком запросе он использован не будет?
17 сен 13, 11:11    [14848004]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Exproment
Member

Откуда:
Сообщений: 416
stenford
т.е. в зависимости от параметра, myfield должен просматривать разные списки IN, можно-ли как-нибудь такое сделать?

Вот сама постановка вопроса никак вам не намекает на использование динамики ? Ну или нескольких
if/else
Намного более лучшее решение чем лепить case в предикатах.
17 сен 13, 12:03    [14848452]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
BestiA
Member

Откуда: Саратов
Сообщений: 44
stenford
Надо выполнить нечто такое:


declare @i varchar(5)
set @i = 'xxx'

select * from mytable 
where myfield in case @i when 'xxx' then (124, 555) else (678, 999) end


т.е. в зависимости от параметра, myfield должен просматривать разные списки IN, можно-ли как-нибудь такое сделать?


IF @i = 'xxx'
select * from mytable where myfield in (124, 555)
ELSE
select * from mytable where myfield in (678, 999)
18 сен 13, 00:20    [14851939]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Glory
stenford
всем спасибо, этот вариант мне больше всего понравился

А серверу - меньше всего
К тому же он (звиняюсь) не совсем правильный...
18 сен 13, 07:24    [14852128]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
берите
Guest
select * 
from mytable 
where (@i = 'xxx' and myfield in (124, 555))
or (@i <> 'xxx' and myfield in (678, 999))

всем должно понравиться.
18 сен 13, 08:25    [14852168]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
берите,

set @i=null
18 сен 13, 11:01    [14852935]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
берите
Guest
Мистер Хенки,

если может быть null, то легко можно будет допилить
18 сен 13, 18:41    [14856344]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
берите,

И чем тогда это будет отличаться от варианта Мистер Хенки? 14847944
18 сен 13, 19:01    [14856401]     Ответить | Цитировать Сообщить модератору
 Re: Как запихать IN в CASE  [new]
берите
Guest
Гость333
берите,

И чем тогда это будет отличаться от варианта Мистер Хенки? 14847944
ничем, я его проглядел
18 сен 13, 19:26    [14856480]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить