Страница 1 из 1

Оператор CASE

Добавлено: 09 ноя 2005, 14:09
pH
Помогите плиз разобратся начинаещему ...
Есть ИБ 6.5 .
а такой вот запрос не проходит ...

Код: Выделить всё

select (case when Field = 'M' then '1' else '0' end) 
from rdb$database
Получаю ошибку: Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 13 when

В ИБ вобще есть такой оператор (CASE)? Или же его нужно подключать из UDF ?

Добавлено: 09 ноя 2005, 14:47
kdv
в IB 6.5 нет оператора CASE, ему там неоткуда взяться.
Прежде чем лепить отсебятину в коде необходимо ознакомиться с документацией на продукт. Эдак я и в дельфи начну писать a++=b, и вопрошать почему это не работает.
CASE появился в Firebird 1.5 и InterBase 7.5.
Из udf case не подключить никак, потому что это языковая конструкция, а не функция.

Добавлено: 09 ноя 2005, 16:45
pH
Извините за надоедливость . А существуют языковые контрукции на сервере ИБ 6.5 которыми можно это все заменить ?
Как же люди справляются с ветвлением в запросах ?

Добавлено: 09 ноя 2005, 16:48
Владимир Каратаев
с помощью if справляются.

Добавлено: 09 ноя 2005, 17:04
pH
To Владимир Каратаев
НО , как я понял из документации конструкция IF доступна ТОЛЬКО из процудур и тригеров. А как же ветвление в ЗАПРОСАХ ? Или я чего-то недопонял ? (Тогда просьба надоумить примером).

Добавлено: 09 ноя 2005, 17:06
Владимир Каратаев
if- в процедуре. других вариантов нет.

Добавлено: 09 ноя 2005, 17:17
Merlin
pH писал(а): НО , как я понял из документации конструкция IF доступна ТОЛЬКО из процудур и тригеров. А как же ветвление в ЗАПРОСАХ ? Или я чего-то недопонял ? (Тогда просьба надоумить примером).
Давно-давно, когда черепаха ещё стояла на трёх китах, люди прекрасным образом обходились без ветвления в запросах. Некоторые пещерные племена при возникновении крайней таковой необходимости писали селективные процедуры и пользовались ими. Другие перепроектировали или наращивали структуры хранения данных (называя это денормализацией и избыточностью). Третьи пользовались калькулируемыми полями в датасете на клиенте. Из-за этого в местах ритуальных встреч представителей племён, называемых ими "форумами" и "конференциями" случались поединки и иной раз даже целые священные войны.

Добавлено: 09 ноя 2005, 18:02
kdv
я был излишне строг - если надо М заменить на 0 и 1 - конечно пиши udf.
Еще все зависит от того, что тебя заставляет сидеть на 6.5.

Добавлено: 09 ноя 2005, 18:32
pH
На 6.5 меня АБСОЛЮТНО ничего не держит ...
База на этапе разработки .

Просто есть куча примеров SELECT вместе с CASE .
Решил "применить" ... думал у меня с ИБ не в порядке ...

Извините за глупый вопрос.
С общего позволения топик объявляется закрытым .
_____________________________________________
Учится , Учится и еще раз учится ... (с) Ленин

Добавлено: 09 ноя 2005, 19:04
kdv
На 6.5 меня АБСОЛЮТНО ничего не держит ...
тогда выбирай или IB 7.5.1, если ты или твои клиенты предполагают за него платить, или FB 1.5.
Чего зря на старье разрабатывать-то.

Добавлено: 31 авг 2006, 17:27
vserd
Доброго здравия, подтвердите баг или ткните носом в ошибку

Firebird 1.5.3.4870 (WI-V1.5.3.4870)

Код: Выделить всё

select
case rp.type_param
    when 'S' then 'xxx1'
    when (rp.type_param is null)  then 'Not assigned'
    else 'Value unknow'
  end
  Type_Param_Str,rp.type_param,
from params rp
получаю сообщение об ошибке

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 4, char 25.
is.

на строке when (rp.type_param is null) then 'Not assigned'".
когда оставляю только "when 'S' then " все работает исправно.

Если оставляю :

Код: Выделить всё

Select
  case rp.type_param
    when (rp.type_param is null)  then 'Not assigned'
  end
  Type_Param_Str,rp.type_param,
from params rp
проблема остается.

попытка найти решение на Sourceforge.net не увенчалась успехом.

Добавлено: 31 авг 2006, 17:35
dimitr
доку надо внимательно читать:

Код: Выделить всё

case 
when (rp.type_param = 'S') then 'xxx1'
when (rp.type_param is null) then 'Not assigned'
else 'Value unknow'
end

Добавлено: 31 авг 2006, 18:06
vserd
2dimitr
Спасибо!!!
Действительно, смешал два синтаксиса :((