Особенно, если вы используете сгустки, вы должны быть осторожны, если вы не уверены в данных там.
Однако, если ваш сабл выглядит только так, вам нужно три regexp_replace
, чтобы это сработало;это также будет намного более динамичным.Просто явно укажите цифры, используя [[:digit:]]
, затем укажите минимальное и максимальное количество раз, когда эти цифры могут быть там, используя {1,2}
.
. Тогда будет работать следующее:
select regexp_replace(
regexp_replace(
regexp_replace( my_string
, '([[:digit:]]{1,2})\.([[:digit:]]{1,2})\.(20[[:digit:]]{2})'
, '\3-\2-\1')
, '-([[:digit:]]{1}(-|$))'
, '0\1' )
, ('-')
, '')
from dual
Это означает, что:
- совпадение (группа 1) 1 или 2 цифры
- совпадение с полной остановкой.
- совпадение (группа 2) 1 или 2 цифры
- соответствуют полной остановке
- соответствуют (группа 3) 20 + 2 цифры.
Затем возьмитеисключить только группы 1, 2 и 3, т.е. игнорировать полные остановки и вернуться затем в порядке 3, 2, 1 с дефисом
, а затем заменить любой [digit]
, за которым следует либо дефис, либоконец строки, т. е. количество цифр составляет только 1 с -0[digit]
.
Наконец, заменить все дефисы.
Отдельно от этого я согласен с tbone .Было бы гораздо разумнее хранить эти данные в отдельной таблице (event_id number, event_date date)
.Любые строковые преобразования просты без возможности ошибиться, в отличие от этой ситуации, и данные легко запрашивать и сравнивать.