Я пытаюсь использовать следующее регулярное выражение для большего запроса, он не работает, что я делаю не так?
with xx as (select '333-22-234223' as a from dual) select xx.a from xx where regexp_like(xx.a,'^[:digit:]{3}-[:digit:]{2}-[:digit:]{6}$');
Альтернатива @Sebastion Brosch
Вы можете заменить класс символов ([:digit:]) на явный диапазон цифр, например:
[:digit:]
with xx as (select '333-22-234223' as a from dual) select xx.a from xx where regexp_like(xx.a,'^[0-9]{3}-[0-9]{2}-[0-9]{6}$');
Для полноты вы можете использовать \d для цифры:
\d
with xx as (select '333-22-234223' as a from dual) select xx.a from xx where regexp_like(xx.a,'^\d{3}-\d{2}-\d{6}$');
Вы можете использовать следующее решение, используя [[:digit:]] (double [...]):
[[:digit:]]
[...]
WITH xx AS ( SELECT '333-22-234223' AS a FROM dual ) SELECT xx.a FROM xx WHERE REGEXP_LIKE(xx.a, '^[[:digit:]]{3}-[[:digit:]]{2}\-[[:digit:]]{6}$');
... или использование [0-9] вместо [[:digit:]]:
[0-9]
WITH xx AS ( SELECT '333-22-234223' AS a FROM dual ) SELECT xx.a FROM xx WHERE REGEXP_LIKE(xx.a, '^[0-9]{3}-[0-9]{2}\-[0-9]{6}$');
демо: http://sqlfiddle.com/#!4/3149e4/120/1
Зачем нужны двойные скобки?
Эти классы символов действительны только внутри выражения в скобках. источник: https://docs.oracle.com/cd/B12037_01/server.101/b10759/ap_posix001.htm