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

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

Добавлено: 26 янв 2007, 10:53
Leons
В ХП есть входящий параметр 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 ...
результат или верен, или ошибка несоответствия типа данных. Плюс данных запрос дольше выполняется.

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

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

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

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

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

[Модератор: удалено лишнее цитирование поста kdv]

Добавлено: 26 янв 2007, 11:15
WildSery

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

select * from sys_journal where (',' || :Code || ',') like ('%,' || operation || ',%')
Мой тебе совет - оставь ES в покое, пока Дмитрий свою биту не достал.

Добавлено: 26 янв 2007, 11:17
Leons
Спасибки)

Добавлено: 26 янв 2007, 11:44
kdv
Это работает на ура везде
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...'.