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

एक स्ट्रिंग में एक वर्ण की सभी घटनाओं को खोजने के लिए Oracle क्वेरी

GolezTrol के उत्तर का विस्तार करते हुए आप अपने द्वारा किए जाने वाले पुनरावर्ती प्रश्नों की संख्या को उल्लेखनीय रूप से कम करने के लिए नियमित अभिव्यक्तियों का उपयोग कर सकते हैं:

 select instr('SSSRNNSRSSR','R', 1, level)
   from dual
connect by level <= regexp_count('SSSRNNSRSSR', 'R')

REGEXP_COUNT() पैटर्न के मिलान की संख्या लौटाता है, इस मामले में R की संख्या देता है SSSRNNSRSSR में मौजूद है . यह रिकर्सन के स्तर को उस सटीक संख्या तक सीमित कर देता है जिसकी आपको आवश्यकता है।

INSTR() बस आपकी स्ट्रिंग में R के सूचकांक की खोज करता है। level रिकर्सन की गहराई है लेकिन इस मामले में यह स्तर th . भी है स्ट्रिंग की घटना के रूप में हम आवश्यक रिकर्स की संख्या तक सीमित हैं।

यदि आप जिस स्ट्रिंग को चुनना चाहते हैं वह अधिक जटिल है तो आप INSTR() के विपरीत REGEXP_INSTR() के रूप में नियमित अभिव्यक्तियों के लिए जा सकते हैं, लेकिन यह धीमा होगा (ज्यादा नहीं) और जब तक आवश्यक न हो तब तक यह अनावश्यक है।

अनुरोध के अनुसार सरल बेंचमार्क:

दो CONNECT BY समाधान इंगित करेंगे कि इस आकार की स्ट्रिंग पर REGEXP_COUNT का उपयोग करना 20% तेज है।

SQL> set timing on
SQL>
SQL> -- CONNECT BY with REGEX
SQL> declare
  2     type t__num is table of number index by binary_integer;
  3     t_num t__num;
  4  begin
  5    for i in 1 .. 100000 loop
  6       select instr('SSSRNNSRSSR','R', 1, level)
  7         bulk collect into t_num
  8         from dual
  9      connect by level <= regexp_count('SSSRNNSRSSR', 'R')
 10              ;
 11     end loop;
 12  end;
 13  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:03.94
SQL>
SQL> -- CONNECT BY with filter
SQL> declare
  2     type t__num is table of number index by binary_integer;
  3     t_num t__num;
  4  begin
  5    for i in 1 .. 100000 loop
  6       select pos
  7         bulk collect into t_num
  8         from ( select substr('SSSRNNSRSSR', level, 1) as character
  9                     , level as pos
 10                  from dual t
 11               connect by level <= length('SSSRNNSRSSR') )
 12        where character = 'R'
 13              ;
 14     end loop;
 15  end;
 16  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:04.80

पाइपलाइन टेबल फ़ंक्शन थोड़ा धीमा है, हालांकि यह देखना दिलचस्प होगा कि यह बहुत सारे मैचों के साथ बड़े स्ट्रिंग्स पर कैसा प्रदर्शन करता है।

SQL> -- PIPELINED TABLE FUNCTION
SQL> declare
  2     type t__num is table of number index by binary_integer;
  3     t_num t__num;
  4  begin
  5    for i in 1 .. 100000 loop
  6       select *
  7         bulk collect into t_num
  8         from table(string_indexes('SSSRNNSRSSR','R'))
  9              ;
 10     end loop;
 11  end;
 12  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:06.54


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ओरेकल में राउनम की तरह मैसकल में पंक्ति संख्या प्राप्त करने का कोई तरीका है?

  2. मैं डायनेमिक SQL में DDL/SCL स्टेटमेंट में बाइंड वेरिएबल्स का उपयोग क्यों नहीं कर सकता?

  3. SQL डेवलपर में SQL मॉनिटरिंग

  4. Oracle 9i, Oracle 10g और Oracle 11g डेवलपर सुइट फॉर्म और रिपोर्ट ट्यूटोरियल

  5. SQLcl (Oracle) का उपयोग करते समय किसी क्वेरी से INSERT कथन कैसे उत्पन्न करें