Если вы получили ORA-01403
, вы были бы счастливчиком .Это ошибка NO_DATA_FOUND
, которая означает, что один (вероятно, первый) запрос ничего не дал.
Эти два оператора можно объединить в
select id
from product
where to_char(psg) in (select value
from settings_am
where key = 'PSG'
);
Почему вы выбрали быvalue
сначала, а затем использовать его в другом запросе?Кроме того, это просто не сработает.v_psg
объявлен как VARCHAR2
переменная.Как вы описали, он содержит следующую строку: '1','2','3'
, как будто это то, что у вас есть:
SQL> create table settings_am (key varchar2(10),
2 value varchar2(20)); --> note size here
Table created.
SQL> insert into settings_am (key, value)
2 values ('PSG', q'['1','2','3']');
1 row created.
SQL> select * From settings_am;
KEY VALUE
---------- --------------------
PSG '1','2','3'
SQL>
Как вы можете видеть, я увеличил размер столбца value
, хотя переменная выобъявил говорит 10
.Зачем?Из-за
SQL> select length(value) from settings_am where key = 'PSG';
LENGTH(VALUE)
-------------
11
то есть вы не можете поместить что-то длинное 11 в то, что принимает длину 10 .
Или, есливаши данные на самом деле содержат 3 строки для ключа PSG
, эти значения уже заключены в одинарные кавычки?Если так, это странно;люди обычно этого не делают.В любом случае, предположим, что вам удалось получить строку '1,2,3'
(что, как я полагаю, у вас есть) в переменную VARCHAR2
, затем вам нужно разбить ее на строки, чтобы иметь возможность использовать ее в IN
предложение:
SQL> create table product (id number, psg varchar2(10));
Table created.
SQL> insert into product (id, psg) values (100, '1');
1 row created.
SQL> insert into product (id, psg) values (200, '2');
1 row created.
SQL>
Тогда выполняется запрос (где строки # 3 - 5 представляют разбиение строки на строки):
SQL> select p.id
2 from product p
3 where p.psg in (select regexp_substr('&&v_psg', '[^,]+', 1, level)
4 from dual
5 connect by level <= regexp_count('&&v_psg', ',') + 1
6 );
Enter value for v_psg: 1,2,3
ID
----------
100
200
Итак, было бы проще использовать
SQL> select id
2 from product
3 where to_char(psg) in (select value
4 from settings_am
5 where key = 'PSG'
6 );
ID
----------
100
200
SQL>
Обратите внимание, что обе опции также показывают, почему ваш запрос неверен: вы не можете поместить два значения (строки) в переменную, объявленную как id_no number;
, так как вы получите TOO_MANY_ROWS
error.
Наконец, что бы вы хотели сделать?Какую проблему ты пытаешься решить?Очевидно, кроме особых случаев (только одна строка для каждого значения) ваш запрос не может работать.Если бы вы могли предоставить контрольный пример (создать таблицу и вставить в пример данных), а также ожидаемый результат, вам было бы легче помочь.