Как использовать переменную / параметр с предложением IN в ORACLE SQL - PullRequest
0 голосов
/ 28 мая 2019

У меня простой запрос на выборку:

SELECT A
FROM B
WHERE A IN :conditions

, где A - это char.

Если я сделаю полный запрос как:

SELECT A
FROM B
WHERE A IN ('A','E','I','O','U')

работает

но если я использую параметр, когда я пытаюсь выполнить с ORACLE SQL Developer, я не могу заставить его работать.

Я уже пытался передать параметр как:

1* ('A','E','I','O','U')
2* 'A','E','I','O','U'
3* A,E,I,O,U

и запрос не возвращает результатов

Какой правильный синтаксис для этого?

Спасибо вам всем

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Вы можете использовать переменную подстановки в SQL Developer (или в SQL * Plus). Используйте двойные кавычки при определении.

Данные испытаний

create table b as select 'A' as a from dual union all 
select 'I' as a from dual union all
select 'U' as a from dual

Исполнение

define params = "'A','E','I','O','U'"
select A from B where A in (&params);

Результат

old:select A from B where A in (&params)
new:select A from B where A in ('A','E','I','O','U')

A
-
A
I
U
0 голосов
/ 28 мая 2019

Передача разделенной запятыми строки в качестве переменной связывания для оператора IN запроса VO

Эта проблема раздражала меня годами, прежде чем я нашел это решение.

Я использовал эту технику для построения поиска объектов в CLI, где я передаю список схем в: BIND

SELECT owner,
       object_name,
       object_type
  FROM all_objects
 WHERE object_name LIKE :SEARCH
   AND owner NOT IN (
    'SYS',
    'MDSYS',
    'DBSNMP',
    'SYSTEM',
    'DVSYS',
    'APEX_050100',
    'PUBLIC',
    'ORDS_METADATA',
    'APEX_LISTENER'
)
   AND object_type IN (
    SELECT regexp_substr(:bind_ename_comma_sep_list,'[^,]+',1,level)
      FROM dual CONNECT BY
        regexp_substr(:bind_ename_comma_sep_list,'[^,]+',1,level) IS NOT NULL
)
 ORDER BY owner,
          object_name,
          object_type;
...