Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PILIH dari tabel dengan daftar VARIASI IN dalam klausa WHERE

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa Oracle menampilkan ??? untuk karakter khusus seperti ö

  2. Program PL/SQL untuk Mencetak Detail Karyawan

  3. Oracle:bagaimana situasinya menggunakan RAISE_APPLICATION_ERROR?

  4. Kapan Oracle mengindeks nilai kolom nol?

  5. 2 Cara Mendapatkan Menit dari Nilai Datetime di Oracle Database