如果你得到了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 的东西中。
或者,如果您的数据实际上包含 PSG 键的 3 行,那么这些值是否已经包含在单引号中?如果是这样,那就奇怪了;人们通常不会那样做。无论如何,假设您设法将字符串'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 错误。
最后,你想做什么?你想解决什么问题?显然,除了特殊情况(每个值只有一行)之外,您的查询无法正常工作。如果您可以提供测试用例(创建表并插入示例数据)以及预期的输出,那么帮助您会更容易。