बढ़िया सवाल! यहां एक फिडल है परिणाम सेट में मैचों को क्वेरी करने का तरीका दिखा रहा है।
और अगर फिडल में क्वेरी का कोई मतलब नहीं है तो यहां लंबी व्याख्या है :)
मैं 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 पर है, और इसका उपयोग किसी अन्य क्वेरी में किया जा सकता है।