Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5. и оператор Case / 16 сообщений из 16, страница 1 из 1
11.06.2015, 08:45
    #38981799
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
Всем, привет и доброе утро!
Раньше стоял у меня сервер FB 2.0 и писал я запросы вида:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
id
from spisok
where 
case when :fio<>'' then 
      case when spisok.fio CONTAINING :fio then 1
      else 0
       end
  else 1 
  end=1



Все отлично работало: если параметр не заполнен - то отображались все записи, заполнен - ищется вхождение.
Но, как только мы перешли на 2.5, SQL менеджер по-другому реагирует на данный запрос и при запуске просит ввести аж Два параметра :Fio, по одному на каждое упоминание в тексте запроса. В FB 2.0 такого, не было. Скажите, можно ли это как-то победить? Спасибо.
...
Рейтинг: 0 / 0
11.06.2015, 08:50
    #38981804
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
delphi_beginSQL менеджер
Это кто?
...
Рейтинг: 0 / 0
11.06.2015, 09:00
    #38981812
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
wadman,

любой теперь так реагирует и EMS Sql Manager, и IBExpert
...
Рейтинг: 0 / 0
11.06.2015, 09:06
    #38981816
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
delphi_beginи IBExpert
Нормально парсит параметры, запрашивает один раз.

Код: sql
1.
select * from problems  where :param=1 and :param = 1
...
Рейтинг: 0 / 0
11.06.2015, 09:08
    #38981819
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
wadman,

а при попытке указать значение выкидывает arithmetic exception, numeric overflow, or string truncation.
string right truncation.

Тут дело в том, что один параметр из двух получает тип varchar(0).
...
Рейтинг: 0 / 0
11.06.2015, 09:10
    #38981825
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
delphi_begin, для начала стоит заметить, что это никак не относится к версии FB и что эксперт нормально парсит запрос.
Может стоит обновить эксперта?
...
Рейтинг: 0 / 0
11.06.2015, 09:22
    #38981834
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
wadman,

IBExpert может и показывает один параметр, но при это выдает ошибку, также как и впоследствии IB-компоненты в Delphi именно на сервере 2.5
...
Рейтинг: 0 / 0
11.06.2015, 09:23
    #38981835
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
delphi_beginТут дело в том, что один параметр из двух получает тип varchar(0).кастуй явно.
...
Рейтинг: 0 / 0
11.06.2015, 09:23
    #38981836
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
delphi_beginIBExpert может и показывает один параметр, но при это выдает ошибку, также как и впоследствии IB-компоненты в Delphi именно на сервере 2.5
Бомби фактами: версия ibe, delphi, fb и главное текст ошибки.
...
Рейтинг: 0 / 0
11.06.2015, 09:29
    #38981840
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
wadman,

Версия IBE - 2015.4.7.1
Delphi - 7
FB - 2.5.4

Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
*
from spisok
where 
case when :fio<>'' then
  case when spisok.fio CONTAINING :fio then 1
  else 0
  end
  else 1 
  end=1


Текст ошибки

Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.


Спасибо
...
Рейтинг: 0 / 0
11.06.2015, 09:37
    #38981849
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
Не могу воспроизвести, работает без проблем. fio в таблице какого типа?
...
Рейтинг: 0 / 0
11.06.2015, 09:40
    #38981851
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
delphi_begin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
  *
from spisok
where 
  case when CAST(:fio AS VARCHAR(63))<>'' 
    then case when spisok.fio CONTAINING CAST(:fio AS VARCHAR(63))
                  then 1
                  else 0
           end
    else 1 
  end = 1



не нравится 63 поставь другой размер. А вообще условие слишком усложнённое

достаточно было

Код: sql
1.
spisok.fio CONTAINING COALESCE(NULLIF(:fio, ''), spisok.fio)
...
Рейтинг: 0 / 0
11.06.2015, 09:41
    #38981853
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
Симонов Денис,

пока ждал помощи, уже сам попробовал и получилось, спасибо. Про COALESCE не слышал, попробую. Спасибо!
...
Рейтинг: 0 / 0
11.06.2015, 09:48
    #38981863
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
Симонов Денисне нравится 63 поставь другой размер. А вообще условие слишком усложнённое
А у меня-то почему работает без этих выкрутасов с кастом?
...
Рейтинг: 0 / 0
11.06.2015, 10:26
    #38981896
delphi_begin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
wadman,

Ты святой)
...
Рейтинг: 0 / 0
11.06.2015, 12:51
    #38982144
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird 2.5. и оператор Case
wadmanСимонов Денисне нравится 63 поставь другой размер. А вообще условие слишком усложнённое
А у меня-то почему работает без этих выкрутасов с кастом?
У вас баг, должно не работать, ищите почему работает :)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5. и оператор Case / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]