Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

WHERE क्लॉज में सूची में भिन्न के साथ तालिका से चयन करें

आपकी आवश्यकता को इन-सूचियों में भिन्नता . कहा जाता है . देखें 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle अनुक्रम मान का आदेश नहीं दिया गया है

  2. Oracle:UPSERT कैसे करें (किसी तालिका में अद्यतन या सम्मिलित करें?)

  3. जावा में pl/sql सरणी वापसी मान प्राप्त करें

  4. Oracle में माइनस/प्लस साइन के साथ नंबर कैसे फॉर्मेट करें?

  5. Oracle jdbc ड्राइवर वर्गों के बीच अंतर?