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

Откуда:
Сообщений: 173
Как задать (если можно) CASE или IF после WHERE. Т.е. в зависимости от какой-то переменной нужно выбирать по двум (пока) разным условиям, одно и тоже. Собственно нужно что-то типа:
SELECT что-то

FROM откуда-то
WHERE CASE @myvar when 1 then первое_условие
when 2 then второе_условие
END

SQL Server 2000
24 дек 03, 11:04    [471899]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А по четче пример можно привести, с более менее понятными значениями условий?
24 дек 03, 11:06    [471909]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Glory
Member

Откуда:
Сообщений: 104760
SELECT что-то

FROM откуда-то
WHERE CASE when @myvar=1 and первое_условие then 1
when @myvar=2 and второе_условие then 1 else 0
END = 1
24 дек 03, 11:08    [471916]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
JibSkeart
Member

Откуда: Из далекой галактики
Сообщений: 19870
а нельзя ли воспользоватся просто IF ???

if @myvar = 1
select с первым условием
if @myvar = 2
select со вторым условием

???


____
Картинка с другого сайта.
24 дек 03, 11:09    [471917]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Berg
Member

Откуда: Кр-ск
Сообщений: 3480
А так не покатит?

SELECT что-то
FROM откуда-то
WHERE (@myvar=1 and первое_условие) OR
(@myvar=2 and второе_условие)
24 дек 03, 11:25    [471962]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Berg
Member

Откуда: Кр-ск
Сообщений: 3480
А вообще tpg прав. Наверняка, можно записать ваше условие достаточно красиво, если писать не для общего случая, а для конкретных условий 1 и 2.
24 дек 03, 11:27    [471966]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
White Lily
Member

Откуда:
Сообщений: 28
То, что написал Berg еще и работать будет быстрее, чем 'CASE'.
24 дек 03, 12:33    [472114]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А то, что написал JibSkeart, наверное, ещё быстрее будет.
24 дек 03, 12:37    [472124]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
White Lily
Member

Откуда:
Сообщений: 28
2tpg
Не факт, не факт...
Да и с if любители компактного кода 'идут лесом'...
24 дек 03, 12:53    [472164]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Я же написал - наверное...
24 дек 03, 12:55    [472167]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Oleg_Martynov
Member

Откуда: Бокситогорск, Лен. обл.
Сообщений: 890
А разве CASE ... WHEN в WHERE - это не тоже самое, что

SELECT что-то
FROM откуда-то
WHERE ((@myvar = 1) AND (первое_условие)) OR
((@myvar = 2) AND (второе_условие))
END

Зачем логическом выражении CASE использовать?
24 дек 03, 12:58    [472170]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Зачем логическом выражении CASE использовать?

Ну, хочет человек - звучание слова, может, сильно подравилось (он же не конкретизирует задачу)...
24 дек 03, 13:01    [472174]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
AlexNsk
Member

Откуда: Новосибирск
Сообщений: 61
Можно так:
Select * from t1

Where 1=
Case
When t1.c1=@x and t1.c2=@y Then 1
When t1.c1=@y and t1.c2=@z Then 1
else 0
end
24 дек 03, 14:27    [472399]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: условие CASE в WHERE  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Oleg_Martynov
А разве CASE ... WHEN в WHERE - это не тоже самое, что
SELECT что-то
FROM откуда-то
WHERE ((@myvar = 1) AND (первое_условие)) OR
 ((@myvar  = 2) AND (второе_условие))
END

Зачем логическом выражении CASE использовать?


Использую данную конструкцию, по пойму, почему второе условие не отрабатывает и выводится "Жалоба". Что делаю не так?
declare @type nvarchar(128)
declare @type1 nvarchar(128)
declare @type2 nvarchar(128)
declare @type3 nvarchar(128)
declare @type4 nvarchar(128)

set @type=''
set @type1='Заявления'
set @type2='Карточки'
set @type3='Вопрос'
set @type4='Книга'

declare @t table (f_num int identity(1,1), f_name varchar(128))
insert @t select 'Заявления'
insert @t select 'Заявления'
insert @t select 'Карточки'
insert @t select 'Карточки'
insert @t select 'Книга'
insert @t select 'Вопрос'
insert @t select 'Вопрос'
insert @t select 'Книга'
insert @t select 'Книга'
insert @t select 'Жалоба'

select * from @t
where 
	 ((@type is not null) and (f_name like '%'+@type+'%')) or
	 ((@type is null) and (f_name like '%'+@type1+'%' or f_name like '%'+@type2+'%' or f_name like '%'+@type3+'%' or f_name like '%'+@type4+'%'))


К сообщению приложен файл. Размер - 32Kb
8 июн 17, 11:39    [20549425]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
   IF 'dsfdsf' like '%%' PRINT 'Васо не шарит!'
8 июн 17, 11:47    [20549470]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
 IF 1=1 OR 1!=1 PRINT  'Самое время изучить ''OR'''
8 июн 17, 11:50    [20549485]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Cammomile
   IF 'dsfdsf' like '%%' PRINT 'Васо не шарит!'

Если бы все шарили, форум был не нужен)

Условие задачи:
1) если задан @type, то выводить только @type - работает
2) выводить всё, что задано в @type1,2,3,4 если не задан @type - не шарит
8 июн 17, 11:54    [20549507]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
2) выводить всё, что задано в @type1,2,3,4 если [b]не задан @type[/b] - не шарит

Ну так не задавай. ;-)
8 июн 17, 12:04    [20549558]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Cammomile
 IF 1=1 OR 1!=1 PRINT  'Самое время изучить ''OR'''

Изучил как мог)
Первое условие-то работает! ;)

К сообщению приложен файл. Размер - 42Kb
8 июн 17, 12:14    [20549591]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
Василиус
Что делаю не так?
Считаете, что set @type='' эквивалентно set @type=null
8 июн 17, 12:15    [20549598]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Cammomile
2) выводить всё, что задано в @type1,2,3,4 если [b]не задан @type[/b] - не шарит


Ну так не задавай. ;-)
Надо ж понимать!
Василиус, наверно, пришёл к нам из крутого Oracle,
а в Oracle что NULL, что '' - всё едино...
8 июн 17, 12:18    [20549622]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
invm
Считаете, что set @type='' эквивалентно set @type=null

Это "синдром ораклиста".
8 июн 17, 12:20    [20549632]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
invm
Василиус
Что делаю не так?
Считаете, что set @type='' эквивалентно set @type=null

Эх, снова всё самому делать надо))

Так работает, но может что-то стоит улучшить?
declare @type nvarchar(128)
declare @type1 nvarchar(128)
declare @type2 nvarchar(128)
declare @type3 nvarchar(128)
declare @type4 nvarchar(128)

set @type=''
set @type1='Заявления'
set @type2='Карточки'
set @type3='Вопрос'
set @type4='Книга'

declare @t table (f_num int identity(1,1), f_name varchar(128))
insert @t select 'Заявления'
insert @t select 'Заявления'
insert @t select 'Карточки'
insert @t select 'Карточки'
insert @t select 'Книга'
insert @t select 'Вопрос'
insert @t select 'Вопрос'
insert @t select 'Книга'
insert @t select 'Книга'
insert @t select 'Жалоба'

select * from @t
where 
	 ((@type = isnull(nullif(@type,''),1)) and (f_name like '%'+@type+'%')) or
	 ((@type <> isnull(nullif(@type,''),1)) and (f_name like '%'+@type1+'%' or f_name like '%'+@type2+'%' or f_name like '%'+@type3+'%' or f_name like '%'+@type4+'%'))


К сообщению приложен файл. Размер - 33Kb
8 июн 17, 12:44    [20549758]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
facepalm
Guest
*facepalm*


set @type= NULL
8 июн 17, 12:50    [20549779]     Ответить | Цитировать Сообщить модератору
 Re: условие CASE в WHERE  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
Василиус
Эх, снова всё самому делать надо))
Переходите на SQL Server 6.5 или более ранний - будет как в Oracle.
8 июн 17, 13:13    [20549894]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить