Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Инструкция IN


Автор: Akella 5.1.2006, 11:09
В коде SQL нужно писать
Код

SELECT * FROM table WHERE field IN ('11', '24','699')


а если в скобках поставить 1000 параметров...smile
а можно ли передать как-нить передать масив, может есть другие способы выборки данных подобным образом?

Автор: xgm 5.1.2006, 13:53
Можно например так: SELECT * FROM table WHERE field IN select ...

...Но лучше не нужно...

Автор: Akella 5.1.2006, 14:20
не, мне так не пойдет
принцип такой, на форие есть TCheckListBox, я выбираю нужные пункты и по этим пунктам формируется IN ('Пункт1', 'Пункт3', и т.д.)
Добавлено @ 14:20
хотя, если эти пункти запихнуть в таблицу, то может и лучше будет использовать IN Select

Автор: Alex 5.1.2006, 14:22
Кол-во констант в наборе имеет ограничение максимум 1500 значений - возможно меньше, если значение велики по размеру, и размер строки запроса превышает его лимит в 64 Кб. (Firebird руководство разработчика баз данных, автор Хелен Борри)

Автор: xgm 5.1.2006, 14:39
Быстрее будет работать конструкция типа:
SELECT * FROM table WHERE EXIST (select ...)


Синтаксикс примерно такой:
exists (select id from table2 where table2.id = table1.id)

Автор: Akella 5.1.2006, 14:42
Цитата(Alex @ 5.1.2006, 14:22 Найти цитируемый пост)

Кол-во констант в наборе имеет ограничение максимум 1500 значений

недопонял
а если у меня несколько инструкций IN, например

Код

where
field1 in ('dfgdfgds','sdfgfdgfdg', и т.д.)
and
field2 in ('11','12', и т.д.)

вот в этом случает всё равно нельзя превышать 1500 или для каждой инструкции IN не должно превышать 1500?

Автор: Alex 5.1.2006, 14:51
каждая.

Еще ссылка по теме http://forum.ibase.ru/phpBB2/viewtopic.php?t=1670

Автор: Akella 5.1.2006, 15:02
меня терзают смутные сомнения по поводу

Цитата(xgm @ 5.1.2006, 14:39 Найти цитируемый пост)

Быстрее будет работать конструкция типа:
SELECT * FROM table WHERE EXIST (select ...)


Синтаксикс примерно такой:
exists (select id from table2 where table2.id = table1.id)


так нужно в базе создавать лишних 5-7 таблиц, писАть в таблицы при выборе пользователем того или иного чекбокса в списке

больше мороки, мне кажется

Автор: TheCetus 15.3.2006, 17:42
в чем проблема?
не знаешь как передать заранее неизвестное число параметров в процедуру или как по ним сформировать динамический SQL запрос?

если первое то можно параметры передать через строку и с помощью UDF функции ее распарсить на элементы, которые затем использовать получится что то типа
Код

declare i integer
declare j integer
declare id integer;
begin
  i = 0;
  j = udf_itemcount(:param);
  while (i < j) do
  begin
    id = udf_getitem(:param, :i); 
    select name from table1 where id = :id
    ...    
  end
end


если второе, то тебе уже все рассказали smile

Автор: Linco 23.3.2006, 16:13
Я не думаю что у тебя в программе будет 1000 checkbox, если их больше 10 это уже не совсем правильная проектировка интерфейса.
А вообще с таблицами in обычно заменяют на join , но надо смотреть конкретный пример.

Автор: AZDesign 31.3.2006, 09:44
Вообще для CheckBox лучше использовать битовые операции
У меня сейчас в проекте 4 CheckBoxList по 30 CheckBox-ов, каждый превращается в один Integer
А в БД положил три функции f_BitTest, f_BitSet, f_BitClear
И выборка осуществляется в 100 раз быстрее чем перечисление их в массиве

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)