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')
là 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.