もしあなたが得たならORA-01403
、あなたはちょっとラッキーでした。これはNO_DATA_FOUND
エラーです。これは、1 つの (おそらく最初の) クエリが何も返さなかったことを意味します。
これらの 2 つのステートメントは、次のように組み合わせることができます。
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;
どちらのオプションも、クエリが間違っている理由を示していることに注意してください。エラーが発生するため、として宣言された変数に 2 つの値 (行) を入れることはできませんTOO_MANY_ROWS
。
最後に、やりたいことは何ですか?どのような問題を解決しようとしていますか? どうやら、特殊なケース (値ごとに 1 行のみ) を除いて、クエリは機能しないようです。テスト ケース (テーブルの作成とサンプル データへの挿入) と、期待される出力を提供できれば、支援が容易になります。