Переменная Oracle SQL: SELECT со списком значений STRING в предложении IN - PullRequest
0 голосов
/ 01 июня 2018

Это работает правильно:

DEFINE numbers = '1,2,3,4,5';
SELECT * FROM table1 WHERE items IN (&numbers);

Как это:

SELECT * FROM table1 WHERE items IN ('a','b','c','d'); error

Возвращает Snytax ERROR :

DEFINE letters = 'a','b','c','d';
SELECT * FROM table1 WHERE items IN (&letters);  -- result syntax ERROR

Как я могу использовать предложение WHERE ... IN, используя список строк, созданный DEFINE?

1 Ответ

0 голосов
/ 01 июня 2018

Заключите значение DEFINE в двойные кавычки:

define letters = "'a','b','c','d'"

set verify on

select * from dual where dummy in (&letters);

old   1: select * from dual where dummy in (&letters)
new   1: select * from dual where dummy in ('a','b','c','d')

no rows selected

Обратите внимание, что задача состоит в том, как DEFINE строка из нескольких слов, поскольку это та же проблема:

SQL> define letters = I love kittens
SQL> define letters
DEFINE LETTERS         = "I" (CHAR)

SQL> define letters = 'a','b','c','d'
SQL> define letters
DEFINE LETTERS         = "a" (CHAR)

Двойные кавычки исправляют это:

SQL> define letters = "I love kittens"
SQL> define letters
DEFINE LETTERS         = "I love kittens" (CHAR)

Просто для полноты, другой способ установить переменную define - из оператора select с использованием подхода column new_value.Исторически это было предусмотрено для динамической установки заголовков страниц в отчетах SQL * Plus, но это удобно в сценариях.(Это также единственный способ установить тип на number, но это не имеет значения.)

SQL> col letters new_value letters
SQL> select q'{'a','b','c','d'}' as letters from dual;

LETTERS
---------------
'a','b','c','d'

1 row selected.

SQL> def letters
DEFINE LETTERS         = "'a','b','c','d'" (CHAR)

SQL> select 123.456 as letters from dual;

   LETTERS
----------
   123.456

1 row selected.

SQL> def letters
DEFINE LETTERS         =    123.456 (NUMBER)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...