आपकी आवश्यकता को इन-सूचियों में भिन्नता . कहा जाता है . देखें WHERE क्लॉज में मूल्यों की सूची में भिन्नता
कारण: IN ('1, 2, 3')
है नहीं IN (1, 2, 3)
. के समान या IN('1', '2', '3')
इसलिए,
<ब्लॉकक्वॉट>चुनें * temp_id से जहां data_id IN (अस्थायी से आईडी चुनें);
जैसा है
<ब्लॉकक्वॉट>चुनें * temp_id से जहां data_id IN('1, 2, 3');
जो एक त्रुटि thrown फेंक देगा 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
जैसा नहीं है
<ब्लॉकक्वॉट>चुनें * temp_id से जहां data_id IN(1, 2, 3);
जो आपको सही आउटपुट देगा -
SQL> SELECT * FROM temp_id WHERE data_id IN(1, 2, 3);
DATA_ID
----------
1
2
3
समाधान :
अपनी आवश्यकता के लिए, आप इसे इस तरह प्राप्त कर सकते हैं -
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
वैकल्पिक रूप से, आप अपना स्वयं का टेबल फ़ंक्शन . बना सकते हैं या एक पाइपलाइन फ़ंक्शन इसे पाने के लिये। आपका लक्ष्य अल्पविराम से अलग की गई IN सूची को कई पंक्तियों में विभाजित करना होना चाहिए . आप इसे कैसे करते हैं यह आप पर निर्भर करता है!
कार्यशील डेमो
आइए मानक EMP . का एक उदाहरण लें SCOTT
में तालिका स्कीमा।
मेरे पास एक स्ट्रिंग में नौकरियों की एक सूची है, और मैं उन नौकरियों के लिए कर्मचारियों की गणना करना चाहता हूं:
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.
ओह! क्या हुआ? मानक emp तालिका को आउटपुट 10 देना चाहिए। इसका कारण यह है कि सूची में भिन्न ।
आइए देखें सही तरीका:
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.