如果你得到了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
即,您不能将 long 11的内容放入接受 length 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
。
最后,你想做什么?你想解决什么问题?显然,除了特殊情况(每个值只有一行)之外,您的查询无法正常工作。如果您可以提供测试用例(创建表并插入示例数据)以及预期的输出,那么帮助您会更容易。