Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

CHỌN từ bảng với danh sách Thay đổi IN trong mệnh đề WHERE

Yêu cầu của bạn được gọi là Danh sách IN thay đổi . Xem Danh sách giá trị thay đổi IN trong mệnh đề WHERE

Lý do: IN ('1, 2, 3') KHÔNG giống như IN (1, 2, 3) HOẶC IN('1', '2', '3')

Do đó,

SELECT * FROM temp_id WHERE data_id IN (CHỌN id TỪ tạm thời);

giống với

CHỌN * TỪ temp_id WHERE data_id IN ('1, 2, 3');

điều này sẽ tạo ra một lỗi 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

KHÔNG giống với

CHỌN * TỪ temp_id WHERE data_id IN (1, 2, 3);

điều này sẽ cung cấp cho bạn đầu ra chính xác -

SQL> SELECT * FROM temp_id WHERE data_id IN(1, 2, 3);

   DATA_ID
----------
         1
         2
         3

Giải pháp:

Đối với yêu cầu của bạn, bạn có thể đạt được nó như thế này -

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

Ngoài ra, bạn có thể tạo hàm TABLE của riêng mình hoặc một hàm Pipelined để đạt được điều này. Mục tiêu của bạn phải là chia danh sách IN được phân tách bằng dấu phẩy thành nhiều hàng . Bạn thực hiện như thế nào là tùy thuộc vào bạn!

Bản trình diễn làm việc

Hãy lấy một ví dụ về tiêu chuẩn EMP bảng trong SCOTT lược đồ.

Tôi có một danh sách các công việc trong một chuỗi và tôi muốn đếm số nhân viên cho các công việc đó:

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.

Ồ! Chuyện gì đã xảy ra thế? Bảng emp tiêu chuẩn sẽ cho kết quả đầu ra là 10. Nguyên nhân là do danh sách IN khác nhau .

Hãy xem cách chính xác:

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. Hướng dẫn sql Oracle:Câu lệnh Sql cơ bản

  2. Làm cách nào để liệt kê tất cả các bảng trong một lược đồ trong Oracle SQL?

  3. Chúng ta có thể cập nhật các giá trị khóa chính của một bảng không?

  4. Làm cách nào để xuất dữ liệu với Oracle SQL Developer?

  5. Cách sao lưu máy ảo RAC