Имя: Пароль:
1C
 
Oracle Objects for OLE (OO4O) как указать несколько значений параметров в запросе с IN()
0 Gluk
 
29.12.17
08:33
В PL/SQL Developer простой запрос отрабатывает правильно:
SELECT * FROM mytable WHERE item IN('111','222')

Использую подключение через "OracleInProcServer.XOraSession":
SELECT * FROM mytable WHERE item IN(:Items)

Если задать параметр:
Parameters.Add("Items", "111", 1)
Отрабатывает верно.

Задаю параметр:
Parameters.Add("Items", "'111','222'", 1) или Parameters.Add("Items", "111,222", 1)
Запрос ничего не возвращает.

Как правильно задать параметр?
1 rphosts
 
29.12.17
08:40
может вторым параметром массив втыкать?
2 Asakra
 
29.12.17
08:47
Parameters.Add("Items1", "111", 1)
Parameters.Add("Items2", "222", 1)
SELECT * FROM mytable WHERE item IN(:Items1,:Items2)
3 Gluk
 
29.12.17
08:48
(1) подскажи как плз, не очень понимаю
4 Gluk
 
29.12.17
08:52
(2) а если количество значения заранее не известно или их много?
5 Asakra
 
29.12.17
08:53
(4) в цикле
6 Gluk
 
29.12.17
09:07
(5) вариант, но не очень хороший
7 NorthWind
 
29.12.17
09:13
(0), (2) чет мне кажется, что не получится в IN массив вставить. Я бы рассмотрел временную или постоянную таблицу, которую предварительно заполнить этими данными и потом сделать селект с условием на содержание элементов в этой таблице.
8 Gluk
 
29.12.17
09:20
(7) попробую
9 Gluk
 
29.12.17
09:22
еще советуют преобразовать строку параметра в таблицу

как это можно сделать?
10 Asakra
 
29.12.17
09:24
(9) в цикле) insert
11 Asakra
 
29.12.17
09:25
может тогда like?
12 Gluk
 
29.12.17
09:30
(9) не, я думаю имеется ввиду это:

WITH xx AS (
    SELECT '1,2,10,15,27,58,135' ss FROM dual)
,  yy AS (
    SELECT regexp_count(ss,',')+1 nn FROM xx)
,  zz AS (
    SELECT LEVEL mm FROM dual, yy
    CONNECT BY LEVEL <= yy.nn)
SELECT zz.mm, to_number(regexp_substr(xx.ss,'[^,]+',1,zz.mm)) RESULT
FROM xx, zz
ORDER BY 1;

но не понимаю как это работает
13 Gluk
 
29.12.17
09:31
(11) like как тут использовать?
14 Asakra
 
29.12.17
09:34
(12) может так: SELECT * FROM mytable WHERE item IN("+СтрокаПараметров+")
(13) как-то так: SELECT * FROM mytable WHERE ("+СтрокаПараметров+") like '%'+item+'%'
15 Asakra
 
29.12.17
09:35
SELECT * FROM mytable WHERE '"+СтрокаПараметров+"' like '%'+item+'%'
16 Asakra
 
29.12.17
09:37
СтрокаПараметров = "'111','222'";
17 Asakra
 
29.12.17
09:37
а для like просто "111,222"
18 Asakra
 
29.12.17
09:39
я бы так делал IN("+СтрокаПараметров+")
19 NorthWind
 
29.12.17
10:16
(18) Можно, но есть нюанс. Я сталкивался с тем, что у некоторых СУБД есть ограничения на количество значений в списке IN (). В частности, встречалась цифра 255 или 256. Поэтому если там может быть реально много данных, то верный вариант - таблица для хранения этих значений и выборка с ней.
20 Asakra
 
29.12.17
10:23
(19) а почему не проверить, как с этим дела у oracle?
21 Asakra
 
29.12.17
10:26
(19) задача же "указать несколько значений параметров в запросе с IN" ))
сколь там этих значений автор не уточняет...
22 NorthWind
 
29.12.17
10:31
мое дело предупредить, а там автору виднее, пусть уточняет
23 Gluk
 
29.12.17
14:01
(18) сработало, спасибо
24 Gluk
 
29.12.17
14:02
(19) "максимальное число выражений в списке - 1000"
25 Вафель
 
29.12.17
14:22
(23) передавать параметры через строку несекурно
https://xkcd.ru/i/327_v1.png
26 Gluk
 
29.12.17
14:24
(25) просвети плз
27 Вафель
 
29.12.17
14:26
(26) Картинку посмотри )))
28 Gluk
 
29.12.17
14:26
(27) я про экранирование и спросил
29 DES
 
29.12.17
14:55
(28) что такое "экранировать" ?
30 Gluk
 
29.12.17
14:59
(29) сказать интерпретатору, что специальные символы не использовать как специальные
31 dk
 
29.12.17
15:03
(9) если не нравится большое количество элементов в IN
то можно эти элементы запихнуть во временную таблицу и перестроить IN (SELECT VAL from #mytemp)
Хотя есть мнение что inner join быстрее чем in отработает
32 Gluk
 
29.12.17
15:22
(31) прав нет на это
AdBlock убивает бесплатный контент. 1Сергей