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

Откуда:
Сообщений: 125
Уважаемые коллеги,
помогите с инструкцией CASE

Приведенная конструкция не работает корректно
Срабатывает всегда только первое условие BZIN
Если его закомментировать, то срабатывает второе VEND

(CASE
when classificationid = 'IC' then 'BZIN'
when classificationid = 'IC' and textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' end) as test,

Заранее благодарен за идею
12 мар 13, 14:37    [14040445]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
masterNike
Member

Откуда:
Сообщений: 125
Так тоже не работает

when classificationid = 'IC' then 'BZIN'
else (case when classificationid = 'IC' and textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' end) end)
12 мар 13, 14:40    [14040468]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Что значит "некорректно"? Какой результат вы хотите получить?
12 мар 13, 14:43    [14040488]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
(CASE
   when classificationid = 'IC' and textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' 
   when classificationid = 'IC' then 'BZIN'
 end) as test,

Так?
12 мар 13, 14:45    [14040503]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
masterNike
Member

Откуда:
Сообщений: 125
Посмотрите на скрин шоте, в колонку KTOKK выводится значение BZIN, хотя по идее должно VEND.

К сообщению приложен файл. Размер - 97Kb
12 мар 13, 14:46    [14040511]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37155
when classificationid = 'IC' and textfield1 not in ('F_UA', 'F_DE', 'F_SE') then 'BZIN'
when classificationid = 'IC' and textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' end
12 мар 13, 14:48    [14040524]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
masterNike
Member

Откуда:
Сообщений: 125
Гость333
(CASE
   when classificationid = 'IC' and textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' 
   when classificationid = 'IC' then 'BZIN'
 end) as test,

Так?



Спасибо Вам Гость333.
Все сработало :)
Нужно было просто поменять местами условия.
12 мар 13, 14:48    [14040527]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
CASE classificationid WHEN 'IC' THEN CASE WHEN textfield1 IN('F_UA', 'F_DE', 'F_SE') THEN 'VEND' ELSE 'BZIN' END END
12 мар 13, 14:51    [14040544]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гавриленко Сергей Алексеевич
when classificationid = 'IC' and textfield1 not in ('F_UA', 'F_DE', 'F_SE') then 'BZIN'
when classificationid = 'IC' and textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' end

Годится только при условии, что в textfield1 не может быть NULL'овых значений...
12 мар 13, 14:51    [14040547]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
masterNike
Member

Откуда:
Сообщений: 125
Сергей Алексеевич,
Так пробовал еще вчера. Не работает.
Однако сейчас все в порядке.
Тема закрыта.
12 мар 13, 14:52    [14040552]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
masterNike
Нужно было просто поменять местами условия.


Нужно было просто прочитать документацию:

Searched CASE expression:

Evaluates, in the order specified, Boolean_expression for each WHEN clause.

Returns result_expression of the first Boolean_expression that evaluates to TRUE.
12 мар 13, 14:53    [14040556]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
masterNike
Member

Откуда:
Сообщений: 125
Да именно.
Значения NULL присутствуют.
12 мар 13, 14:54    [14040561]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
masterNike
Спасибо Вам Гость333.
Все сработало :)
Нужно было просто поменять местами условия.

Не так.

Нужно понять принцип работы case. Он выбирает первое подходящее условие, если не находит ни одного подходящего, берет значение из else (его желательно бы дописать). все строки, подходящие под второе условие, подходят и под первое, поэтому второе условие никогда не проверится - до него дело не дойдет.
12 мар 13, 14:55    [14040567]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гузы
Guest
masterNike
...
Нужно было просто поменять местами условия.

Не... Нуно было посмотреть описание case... Но это уже было.

И вообще мне больше так нравится:
case when  classificationid = 'IC' then
    case when textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' end
else 'BZIN' end
12 мар 13, 16:01    [14041106]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
Гузы
masterNike
...
Нужно было просто поменять местами условия.

Не... Нуно было посмотреть описание case... Но это уже было.

И вообще мне больше так нравится:
case when  classificationid = 'IC' then
    case when textfield1 in ('F_UA', 'F_DE', 'F_SE') then 'VEND' end
else 'BZIN' end
Списывать нехорошо!
Тем более с ошибками!
12 мар 13, 16:08    [14041176]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
ГуЗы
Guest
iap,
А если
textfield1  is null
?
В Вашем случае
else = not in () 

Но, вообще-то sorry, не весь топик просмотрел.
12 мар 13, 16:17    [14041258]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
ГуЗы
iap,
А если
textfield1  is null
?
В Вашем случае
else = not in () 

Но, вообще-то sorry, не весь топик просмотрел.
Если textfield1 is null, то выполнится ELSE вложенного CASE, вернётся 'BZIN'.
Ибо NULL IN('F_UA', 'F_DE', 'F_SE') = UNKNOWN <> TRUE.

Если при этом classificationid='IC', конечно.
12 мар 13, 16:22    [14041298]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
ГуЗы,

и ELSE - это вовсе не NOT IN(). Оно выполнится, если ни один WHEN так и не вернёт TRUE.
Без дополнительных проверок каких бы то ни было условий.
12 мар 13, 16:24    [14041312]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гузы
Guest
iap
Ибо NULL IN('F_UA', 'F_DE', 'F_SE') = UNKNOWN <> TRUE.

Yes Sir!
But:
NULL IN('F_UA', 'F_DE', 'F_SE') = UNKNOWN<>False.
ЕМНИП, else срабатывает при False...

At any case, в условии
where not in ()
null игнорирует. Isn't it?

Было приятно поболтать. By!
12 мар 13, 16:53    [14041497]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гузы
ЕМНИП, else срабатывает при False...

Память вам таки изменяет:
BOL, CASE
ELSE else_result_expression
Is the expression returned if no comparison operation evaluates to TRUE.

То бишь, ELSE срабатывает, если все предыдущие логические выражения были равны FALSE либо UNKNOWN.
12 мар 13, 17:07    [14041599]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите пожалуйста по условию CASE  [new]
Гузы
Guest
Гость333,
Sorry! Перепутал с прямым углом (Where). Но код-то сработает.
12 мар 13, 17:31    [14041714]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить