Оператор CASE

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
pH
Сообщения: 10
Зарегистрирован: 09 ноя 2005, 13:43

Оператор CASE

Сообщение pH » 09 ноя 2005, 14:09

Помогите плиз разобратся начинаещему ...
Есть ИБ 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 ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 ноя 2005, 14:47

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

pH
Сообщения: 10
Зарегистрирован: 09 ноя 2005, 13:43

Сообщение pH » 09 ноя 2005, 16:45

Извините за надоедливость . А существуют языковые контрукции на сервере ИБ 6.5 которыми можно это все заменить ?
Как же люди справляются с ветвлением в запросах ?

Владимир Каратаев
Сообщения: 22
Зарегистрирован: 01 ноя 2004, 11:11

Сообщение Владимир Каратаев » 09 ноя 2005, 16:48

с помощью if справляются.

pH
Сообщения: 10
Зарегистрирован: 09 ноя 2005, 13:43

Сообщение pH » 09 ноя 2005, 17:04

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

Владимир Каратаев
Сообщения: 22
Зарегистрирован: 01 ноя 2004, 11:11

Сообщение Владимир Каратаев » 09 ноя 2005, 17:06

if- в процедуре. других вариантов нет.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 09 ноя 2005, 17:17

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 ноя 2005, 18:02

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

pH
Сообщения: 10
Зарегистрирован: 09 ноя 2005, 13:43

Сообщение pH » 09 ноя 2005, 18:32

На 6.5 меня АБСОЛЮТНО ничего не держит ...
База на этапе разработки .

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 ноя 2005, 19:04

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

vserd
Сообщения: 10
Зарегистрирован: 31 авг 2006, 17:15

Сообщение vserd » 31 авг 2006, 17:27

Доброго здравия, подтвердите баг или ткните носом в ошибку

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 не увенчалась успехом.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 31 авг 2006, 17:35

доку надо внимательно читать:

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

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

vserd
Сообщения: 10
Зарегистрирован: 31 авг 2006, 17:15

Сообщение vserd » 31 авг 2006, 18:06

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

Ответить