आप इसे अलग-अलग कैप्चर समूहों को निकालकर डबल रिवर्स के बिना कर सकते हैं (चारों ओर ()
कोष्ठक):
WITH t ( VAL ) AS (
SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 1 ) AS COL4,
REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 2 ) AS COL3,
REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 3 ) AS COL2,
REGEXP_SUBSTR( val, '^(.*)_([^_]+)_([^_]+)_([^_]+)$', 1, 1, NULL, 4 ) AS COL1
FROM t
आप रेगुलर एक्सप्रेशन को केवल उपयोग करके और भी सरल बना सकते हैं:
'^(.+)_(.+)_(.+)_(.+)$'
पहला .+
लालची है इसलिए यह जितना संभव हो उतना मेल खाएगा जब तक कि दूसरे - चौथे कैप्चरिंग समूहों पर न्यूनतम मैचों के लिए केवल पर्याप्त स्ट्रिंग शेष न हो।
हालांकि, आपको रेगुलर एक्सप्रेशन की आवश्यकता नहीं है :
WITH t ( VAL ) AS (
SELECT 'my_new_table_2015_06_31' FROM DUAL UNION ALL
SELECT 'my_new_table_temp_2016_06_31' FROM DUAL
)
SELECT SUBSTR( val, 1, pos1 - 1 ) AS col4,
SUBSTR( val, pos1 + 1, pos2 - pos1 - 1 ) AS col3,
SUBSTR( val, pos2 + 1, pos3 - pos2 - 1 ) AS col2,
SUBSTR( val, pos3 + 1 ) AS col1
FROM (
SELECT val,
INSTR( val, '_', -1, 1 ) AS pos3,
INSTR( val, '_', -1, 2 ) AS pos2,
INSTR( val, '_', -1, 3 ) AS pos1
FROM t
);