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

Откуда:
Сообщений: 19
Доброго времени суток!
Давно мучает вопрос, можно ли внутри WHEN влепить ветвление? Например что-то такое:

declare @a as varchar(1);
declare @b as varchar(1);

...

select * 
from t_stored_item 
where case 
         when @a = @b then location_id like 'A%'
         else location_id like 'P%'
      end
16 сен 09, 12:08    [7666444]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Glory
Member

Откуда:
Сообщений: 104760
select * 
from t_stored_item 
where case 
         when @a = @b and location_id like 'A%' then 1 when @a <> @b and location_id like 'P%' then 1
      end = 1
16 сен 09, 12:12    [7666468]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А чем так не устраивает?

select *
from t_stored_item 
where location_id like case 
         when @a = @b then 'A%'
         else  'P%'
      end
Ваш код вызовет синтаксическую ошибку.
16 сен 09, 12:12    [7666475]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
CASE - это функция, которая возвращает одно значение одного из типов, поддерживаемых сервером.
А на сервере нет булевского типа. Поэтому вернуть "логическое выражение" CASE никак не может.
WHEN, однако, может содержать другой CASE, результат работы которого надо с чем-нибудь сравнить
16 сен 09, 12:16    [7666505]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Добрый Э - Эх
Guest
iap
CASE - это функция, которая возвращает одно значение одного из типов, поддерживаемых сервером.
А на сервере нет булевского типа. Поэтому вернуть "логическое выражение" CASE никак не может.
WHEN, однако, может содержать другой CASE, результат работы которого надо с чем-нибудь сравнить
CASE - не функция, CASE - выражение. В остальном согласен...
16 сен 09, 12:19    [7666530]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Добрый Э - Эх
iap
CASE - это функция, которая возвращает одно значение одного из типов, поддерживаемых сервером.
А на сервере нет булевского типа. Поэтому вернуть "логическое выражение" CASE никак не может.
WHEN, однако, может содержать другой CASE, результат работы которого надо с чем-нибудь сравнить
CASE - не функция, CASE - выражение. В остальном согласен...

Таки она функция
16 сен 09, 12:20    [7666544]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Добрый Э - Эх
iap
CASE - это функция, которая возвращает одно значение одного из типов, поддерживаемых сервером.
А на сервере нет булевского типа. Поэтому вернуть "логическое выражение" CASE никак не может.
WHEN, однако, может содержать другой CASE, результат работы которого надо с чем-нибудь сравнить
CASE - не функция, CASE - выражение. В остальном согласен...
А по каким признакам CASE - не функция?
16 сен 09, 12:27    [7666580]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
iljy
Member

Откуда:
Сообщений: 8711
Добрый Э - Эх,

БОЛ

Функция CASE — это специальное выражение Transact-SQL, которое позволяет выводить альтернативное значение в зависимости от значения столбца. Это временное изменение в данных, оно не сохраняется навсегда. Например, функция CASE позволяет отобразить значение «Калифорния» в наборе результатов запроса для строк, имеющих значение CA в столбце state.

Функция CASE состоит из:
......


так что в определенном смысле правы все ;)
16 сен 09, 12:29    [7666597]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
iap
А по каким признакам CASE - не функция?
По описаниям в документации
В 2000 она функцией обзывается, а начиная с 2005 уже выражением (хотя для компакт редакции всё же функция).

Сообщение было отредактировано: 16 сен 09, 12:31
16 сен 09, 12:31    [7666605]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
iljy
Member

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

я цитировал БОЛ 2005.
16 сен 09, 12:32    [7666611]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
iljy
tpg,

я цитировал БОЛ 2005.
Ссылку киньте.
16 сен 09, 12:33    [7666612]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
iljy
Member

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

Использование функции CASE 2005

а тут уже выражение, хотя статья называется так же
Использование функции CASE 2008
16 сен 09, 12:36    [7666635]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
iljy
Member

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

хе, они сами не знают как его называть:) в онлайн-хелпе называют и так и так, в моем локальном (ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ru/udb9/html/807d695a-035e-48f6-8612-295c3fda5e8d.htm) - в основном функцией
16 сен 09, 12:38    [7666648]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Glory
Member

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


а тут уже выражение, хотя статья называется так же
Использование функции CASE 2008

Мало того по ходу статьи все равно встречаются "Еще одно назначение функции CASE — категоризация данных."
16 сен 09, 12:38    [7666650]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Добрый Э - Эх
Guest
iap
А по каким признакам CASE - не функция?
Всегда считал, что функция вычисляет все свои аргументы на момент вызова, до непосредственного своего выполнения. Выражение же вычисляет свои аргументы по мере надобности, в процессе выполнения:
--
-- case - выражение, поэтому не напарываемся на деление на ноль:
select case when 1 is not null then 1 else 1/0 end;
--
-- round - функция, поэтому взрывается при попытке поделить на ноль
select round(5.123, 1 + 1/0);

Не исключаю возможности своего заблуждения...
16 сен 09, 12:39    [7666652]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Hellner
Member

Откуда:
Сообщений: 19
пример тут приведен именно для "примера". А вопрос то звучит так: можно ли как-то определить ветвление внутри WHERE, т.е. при выполнении одного условия - идет одно сравнение, при выполнении другого условия - сравнение совершенно иное, с совершенно другими полями этой таблицы. Сразу скажу, что UNION не устраивает в моей ситуации.
Заранее благодарен.
16 сен 09, 12:47    [7666703]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
И чем Вас не устраивает первый же данный Вам ответ?

(тот который заканчивается end = 1)
16 сен 09, 12:50    [7666734]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Hellner
пример тут приведен именно для "примера". А вопрос то звучит так: можно ли как-то определить ветвление внутри WHERE, т.е. при выполнении одного условия - идет одно сравнение, при выполнении другого условия - сравнение совершенно иное, с совершенно другими полями этой таблицы. Сразу скажу, что UNION не устраивает в моей ситуации.
Заранее благодарен.
Это же очень просто:
WHERE ОдноУсловие AND ОдноСравнение
OR ВтороеУсловие AND ВтороеСравнение
OR ТретьеУсловие AND ТретьеСравнение
OR ...
Правда, выполнение первого условия не отменяет проверку второго, третьего и т.д., как это происходит в CASE WHEN THEN END
16 сен 09, 12:54    [7666775]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Добрый Э - Эх
iap
А по каким признакам CASE - не функция?
Всегда считал, что функция вычисляет все свои аргументы на момент вызова, до непосредственного своего выполнения. Выражение же вычисляет свои аргументы по мере надобности, в процессе выполнения:
--
-- case - выражение, поэтому не напарываемся на деление на ноль:
select case when 1 is not null then 1 else 1/0 end;
--
-- round - функция, поэтому взрывается при попытке поделить на ноль
select round(5.123, 1 + 1/0);

Не исключаю возможности своего заблуждения...

Тем не менее, CASE в хелпе расположена в главе System Functions
И согласно синтаксису else 1/0 является result_expression-ом, а не input_expression, т.е. result_expression и не должен вычисляться на момент вызова функции
16 сен 09, 13:02    [7666843]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Добрый Э - Эх
Guest
Glory
И согласно синтаксису else 1/0 является result_expression-ом, а не input_expression, т.е. result_expression и не должен вычисляться на момент вызова функции
ОК, а WHEN это input_expression ??? И если так, то почему же у нас не ловится ошибка:
--
-- case - выражение, поэтому не напарываемся на деление на ноль:
select 
   case 
      when 1 is not null then 1 
      WHEN 1/0 is null then 1/0 
      else 1/0 
   end;
???
16 сен 09, 13:07    [7666884]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Hellner
Member

Откуда:
Сообщений: 19
Веселое решение! Спасибо!
16 сен 09, 13:08    [7666889]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Hellner
Member

Откуда:
Сообщений: 19
iap
Hellner
пример тут приведен именно для "примера". А вопрос то звучит так: можно ли как-то определить ветвление внутри WHERE, т.е. при выполнении одного условия - идет одно сравнение, при выполнении другого условия - сравнение совершенно иное, с совершенно другими полями этой таблицы. Сразу скажу, что UNION не устраивает в моей ситуации.
Заранее благодарен.
Это же очень просто:
WHERE ОдноУсловие AND ОдноСравнение
OR ВтороеУсловие AND ВтороеСравнение
OR ТретьеУсловие AND ТретьеСравнение
OR ...
Правда, выполнение первого условия не отменяет проверку второго, третьего и т.д., как это происходит в CASE WHEN THEN END


да не... в этом случае, рассматривая все варианты, можно несколько страниц написать одним where)))
16 сен 09, 13:09    [7666898]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Добрый Э - Эх
Glory
И согласно синтаксису else 1/0 является result_expression-ом, а не input_expression, т.е. result_expression и не должен вычисляться на момент вызова функции
ОК, а WHEN это input_expression ??? И если так, то почему же у нас не ловится ошибка:
--
-- case - выражение, поэтому не напарываемся на деление на ноль:
select 
   case 
      when 1 is not null then 1 
      WHEN 1/0 is null then 1/0 
      else 1/0 
   end;
???

Simple CASE function: 
CASE input_expression 
     WHEN when_expression THEN result_expression 
    [ ...n ] 
     [ 
    ELSE else_result_expression 
     ] 
END 
Searched CASE function:
CASE
     WHEN Boolean_expression THEN result_expression 
    [ ...n ] 
     [ 
    ELSE else_result_expression 
     ] 
END
16 сен 09, 13:09    [7666904]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Добрый Э - Эх
Guest
Glory
Ладно, смотрю - спорить бессмысленно. Всё одно, каждый останется при своем мнении...
16 сен 09, 13:13    [7666939]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос о условии внутри WHERE...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Добрый Э - Эх
Glory
Ладно, смотрю - спорить бессмысленно. Всё одно, каждый останется при своем мнении...

О чем спор ?
Два разных формата вызова CASE - в одном есть входные параметры, в другом их нет
16 сен 09, 13:16    [7666958]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить