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

एक varchar2 () में सभी मैच खोजें

बढ़िया सवाल! यहां एक फिडल है परिणाम सेट में मैचों को क्वेरी करने का तरीका दिखा रहा है।

और अगर फिडल में क्वेरी का कोई मतलब नहीं है तो यहां लंबी व्याख्या है :)

मैं RegEx_Test . नामक तालिका का उपयोग कर रहा हूं एक कॉलम के साथ MyVal . यहाँ तालिका की सामग्री है:

MyVal
------------------------------
[A1][abc][B23][D123]a33[bx5]
[Z15][ax0][B0][F13]R3
[X215][A3A][J99]F33F33G24[43][R3]
[Z99][c1][F3][d33]3x24[Y3][f13]
[9a][D41][Q39][XX12]B27[T03][J12]

आपका regexp यह है:\[[[:alpha:]][[:digit:]]{1,2}\] . यह POSIX :alpha: . को छोड़कर दूसरे उत्तर की तरह ही है और :digit: संकेतक, जो अंतरराष्ट्रीय वर्णों के मामले में सुरक्षित हैं।

सबसे पहले, आपको किसी भी लाइन पर मैचों की अधिकतम संख्या जानने की जरूरत है। REGEXP_COUNT का उपयोग करें इसके लिए:

SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
  FROM Regex_Test

MAX(REGEXP_COUNT(My...
----------------------
                     6

"काउंटर" तालिका प्राप्त करने के लिए उस अधिकतम गणना का उपयोग करें (यह SELECT ... FROM DUAL है नीचे) और काउंटर टेबल को एक क्वेरी के साथ क्रॉस-जॉइन करें जो REGEXP_SUBSTR का उपयोग करके आपके मूल्यों को खींच लेगी . REGEXP_SUBSTR एक "घटना" पैरामीटर है और वह Counter . का उपयोग करेगा :

SELECT
  MyVal,
  Counter,
  REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
FROM Regex_Test
CROSS JOIN (
   SELECT LEVEL Counter
   FROM DUAL
   CONNECT BY LEVEL <= (
     SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
     FROM Regex_Test)) Counters

यहाँ मेरी तालिका (आंशिक परिणाम) के विरुद्ध एक नमूना चलाया गया है:

MyVal                              Counter Matched
---------------------------------- ------- -------
[9a][D41][Q39][XX12]B27[T03][J12]        1 [D41]
[9a][D41][Q39][XX12]B27[T03][J12]        2 [Q39]
[9a][D41][Q39][XX12]B27[T03][J12]        3 [T03]
[9a][D41][Q39][XX12]B27[T03][J12]        4 [J12]
[9a][D41][Q39][XX12]B27[T03][J12]        5
[9a][D41][Q39][XX12]B27[T03][J12]        6
[A1][abc][B23][D123]a33[bx5]             1 [A1]
[A1][abc][B23][D123]a33[bx5]             2 [B23]
[A1][abc][B23][D123]a33[bx5]             3
... and so on - total is 30 rows

इस बिंदु पर आपके पास अलग-अलग मैचों का परिणाम सेट है, साथ ही नल जहां एक पंक्ति में अधिकतम मैचों से कम है। मैचों में अभी भी उनके आसपास के कोष्ठक हैं। पूरी चीज़ को एक बाहरी क्वेरी के साथ घेरें जो नल को फ़िल्टर करेगी और कोष्ठक को हटा देगी, और आपके पास आपकी अंतिम सूची होगी:

SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
  SELECT
    MyVal,
    Counter,
    REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
  FROM Regex_Test
  CROSS JOIN (
     SELECT LEVEL Counter
     FROM DUAL
     CONNECT BY LEVEL <= (
       SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
       FROM Regex_Test)) Counters
) WHERE Matched IS NOT NULL

यह वह क्वेरी है जो Fiddle पर है, और इसका उपयोग किसी अन्य क्वेरी में किया जा सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RODBC क्वेरी डेटा वापस नहीं कर रही है

  2. SQL सर्वर में 1 से समूह कैसे करें

  3. Oracle-Conveting SQL से ANSI SQL

  4. अनुक्रमित संख्या कॉलम पर 'पसंद' का उपयोग कर ओरेकल क्वेरी, खराब प्रदर्शन

  5. Oracle में DateDiff() का उपयोग करना