выбор значений из переменной

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

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

Ответить
Leons
Сообщения: 29
Зарегистрирован: 24 фев 2006, 08:29

выбор значений из переменной

Сообщение Leons » 26 янв 2007, 10:53

В ХП есть входящий параметр CODE VarChar(250).
В нем хранятся значения типа '210,205,1,-5'

Следующий запрос работает не верно.

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

select * from sys_journal where operation in (:CODE) into ...
Результат при значениях в параметре '210,205,1,-5' - все данные где operation = -5!

При выполнении

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

EXECUTE STATEMENT 'select * from sys_journal where operation in ('||:CODE||')' into ...
результат или верен, или ошибка несоответствия типа данных. Плюс данных запрос дольше выполняется.

Как можно решить данную проблему?

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

Сообщение kdv » 26 янв 2007, 11:05

Следующий запрос работает не верно.
верно работает. в параметр можно передать только ОДНО значение. А не список. С чего вы вообще взяли, что IB/FB будут вот такой "перечень" обрабатывать?

кстати, в FAQ это есть. www.ibase.ru/ibfaq.htm
Как можно решить данную проблему?
какую именно проблему? нет тут никакой проблемы. если вторая конструкция не выполняется, значит в списке in вы пишете не то.

Вообще судя по вопросу Вам пока рановато execute statement использовать.

Leons
Сообщения: 29
Зарегистрирован: 24 фев 2006, 08:29

Сообщение Leons » 26 янв 2007, 11:15

в параметр можно передать только ОДНО значение.
Параметр VarChar. Данные записываются через запятую. Итог - текстовая строчка.
С чего вы вообще взяли, что IB/FB будут вот такой "перечень" обрабатывать?
Это работает на ура везде
Select * from TABLE where operation in (1,2,3,4)

[Модератор: удалено лишнее цитирование поста kdv]
Последний раз редактировалось Leons 26 янв 2007, 11:15, всего редактировалось 1 раз.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 26 янв 2007, 11:15

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

select * from sys_journal where (',' || :Code || ',') like ('%,' || operation || ',%')
Мой тебе совет - оставь ES в покое, пока Дмитрий свою биту не достал.
Последний раз редактировалось WildSery 26 янв 2007, 11:17, всего редактировалось 1 раз.

Leons
Сообщения: 29
Зарегистрирован: 24 фев 2006, 08:29

Сообщение Leons » 26 янв 2007, 11:17

Спасибки)

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

Сообщение kdv » 26 янв 2007, 11:44

Это работает на ура везде
Select * from TABLE where operation in (1,2,3,4)
правильно. вот только в
select ... where field in :param
имеется в виду значение параметра, а значение параметра это всегда ОДНО значение, а не набор. Даже если вы передаете туда строку
'1,2,3,4', сервер воспринимает это как одно значение, и будет выполнять как field = :param. То есть, сама по себе конструкция
where field in :param
бредовая, хоть и допускается сервером.

насчет execute statement - я добрый. пользуйтесь этим оператором как можно чаще. постарайтесь, чтобы он встречался примерно как половина всех выполняемых в коде операторов sql. даже если рука потянется написать select ... - оформите его в Execute statement 'select...'.

Ответить