[TL; DR] Регулярные выражения не находят совпадающих совпадений.
Первый матч:
SELECT REGEXP_SUBSTR(
'500 ,Oracle 1234,123Parkway123aa 123, 768Redwood Shores, CA,',
'\d+,\d+[^,]+,',
1,
1
) "REGEXPR_SUBSTR"
FROM DUAL;
Является:
1234,123Parkway123aa 123,
Будет выполнен поиск второго совпадения после первого совпадения (не совпадает с первым совпадением); поэтому будет искать второе совпадение в подстроке:
' 768Redwood Shores, CA,'
и ничего не находит.
Даже если регулярные выражения поддерживают перекрывающиеся совпадения (они этого не делают), они ничего не найдут, поскольку после запятой есть пробел, который не соответствует вашему шаблону.
Это позволит перекрывать совпадения (но гораздо сложнее и не является единственной функцией):
SQL Fiddle
Запрос 1 :
WITH data ( value ) AS (
SELECT '500 ,Oracle 1234,123Parkway123aa 123, 768Redwood Shores, CA,'
FROM DUAL
),
pos ( value, match, pos, lvl ) AS (
SELECT value,
REGEXP_SUBSTR( value, '\d+,\s*\d+[^,]+?(\d*),', 1, 1 ),
REGEXP_INSTR( value, '\d+,\s*\d+[^,]+?(\d*),', 1, 1, 0, NULL, 1 ),
1
FROM data
UNION ALL
SELECT value,
REGEXP_SUBSTR( value, '\d+,\s*\d+[^,]+?(\d*),', pos, 1 ),
REGEXP_INSTR( value, '\d+,\s*\d+[^,]+?(\d*),', pos, 1, 0, NULL, 1 ),
lvl + 1
FROM pos
WHERE pos > 0
)
SELECT match
FROM pos
WHERE pos > 0
AND lvl = 2
Результаты
| MATCH |
|-------------------------|
| 123, 768Redwood Shores, |