Persyaratan Anda disebut sebagai Varying IN-lists . Lihat Memvariasikan daftar nilai IN dalam klausa WHERE
Alasan : IN ('1, 2, 3')
adalah TIDAK sama dengan IN (1, 2, 3)
ATAU IN('1', '2', '3')
Oleh karena itu,
SELECT * FROM temp_id WHERE data_id IN(SELECT id FROM temp);
sama dengan
PILIH * FROM temp_id WHERE data_id IN('1, 2, 3');
yang akan menimbulkan kesalahan ORA-01722: invalid number
-
SQL> SELECT * FROM temp_id WHERE data_id IN('1, 2, 3');
SELECT * FROM temp_id WHERE data_id IN('1, 2, 3')
*
ERROR at line 1:
ORA-01722: invalid number
SQL> SELECT * FROM temp_id WHERE data_id IN(SELECT ids FROM temp);
SELECT * FROM temp_id WHERE data_id IN(SELECT ids FROM temp)
*
ERROR at line 1:
ORA-01722: invalid number
TIDAK sama dengan
PILIH * FROM temp_id WHERE data_id IN(1, 2, 3);
yang akan memberi Anda hasil yang benar -
SQL> SELECT * FROM temp_id WHERE data_id IN(1, 2, 3);
DATA_ID
----------
1
2
3
Solusi :
Untuk kebutuhan Anda, Anda dapat mencapainya seperti ini -
SQL> SELECT * FROM temp;
IDS
--------------------------------------------------------------
1, 2, 3
SQL> SELECT * FROM temp_id;
DATA_ID
----------
1
2
3
4
5
SQL> WITH data AS
2 (SELECT to_number(trim(regexp_substr(ids, '[^,]+', 1, LEVEL))) ids
3 FROM temp
4 CONNECT BY instr(ids, ',', 1, LEVEL - 1) > 0
5 )
6 SELECT * FROM temp_id WHERE data_id IN
7 (SELECT ids FROM data
8 )
9 /
DATA_ID
----------
1
2
3
Atau, Anda dapat membuat fungsi TABEL Anda sendiri atau Fungsi berpipa untuk mencapai ini. Sasaran Anda seharusnya membagi daftar IN yang dipisahkan koma menjadi beberapa baris . Terserah Anda bagaimana melakukannya!
Demo kerja
Mari kita ambil contoh EMP standar tabel dalam SCOTT
skema.
Saya memiliki daftar pekerjaan dalam sebuah string, dan saya ingin menghitung karyawan untuk pekerjaan tersebut:
SQL> SET serveroutput ON
SQL> DECLARE
2 str VARCHAR2(100);
3 cnt NUMBER;
4 BEGIN
5 str := q'[CLERK,SALESMAN,ANALYST]';
6 SELECT COUNT(*) INTO cnt FROM emp WHERE JOB IN (str);
7 dbms_output.put_line('The total count is '||cnt);
8 END;
9 /
The total count is 0
PL/SQL procedure successfully completed.
Oh! Apa yang terjadi? Tabel emp standar harus memberikan output 10. Alasannya adalah bahwa daftar IN yang bervariasi .
Yuk simak cara yang benar:
SQL> SET serveroutput ON
SQL> DECLARE
2 str VARCHAR2(100);
3 cnt NUMBER;
4 BEGIN
5 str := q'[CLERK,SALESMAN,ANALYST]';
6 SELECT COUNT(*)
7 INTO cnt
8 FROM emp
9 WHERE job IN
10 (SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL))
11 FROM dual
12 CONNECT BY instr(str, ',', 1, LEVEL - 1) > 0
13 );
14 dbms_output.put_line('The total count is '||cnt);
15 END;
16 /
The total count is 10
PL/SQL procedure successfully completed.