Postgres использует regexp_replace, чтобы сопоставить символ в определенной позиции и заменить - PullRequest
0 голосов
/ 12 марта 2019

Мне нужно проверить, совпадают ли первые 2 символа строки с '00' или '01' или '02, и заменить на '24', '25' или '26' соответственно.

Так, например, заменить

'02:00:00' with  '26:00:00'

Я пытаюсь:

SELECT replace(replace(replace('01:01:00'::varchar, '00:', '24:'),'01:', '25:'), '02:', '26:')

не работает, потому что возвращает:

"25:25:00"

Я хочу, чтобы условие совпадения было только для первых 2 символов:

"25:01:00"

Возможно, regexp_replace - правильный путь, но я не могу найти решение.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Вот версия PostgreSQL моего предыдущего примера Oracle, которая логически делает то же самое.Иногда вам нужно RTFM!:-) Возвращает первый элемент из первой группы, используя протестированную функцию substring (), замененную на значение, которое вы хотите заменить, объединенную с остальной частью строки, которая возвращается из группы из второй подстроки.() вызов.

select 
  case substring(str from '^(\d{2}:)')
    when '00:' then '24:'
    when '01:' then '25:'
    when '02:' then '26:'
    else substring(str from '^(\d{2}:)')
  end || substring(str from '^\d{2}:(\d{2}:\d{2})$') as fixed
from tbl;

Пример SQL Fiddle

Дополнительная информация о регулярных выражениях

1 голос
/ 12 марта 2019
select regexp_replace('01:01:03', '([0-9]{2})(:[0-9]{2}:[0-9]{2})', 'aa\2');

Есть две группы, сначала с двумя числами, а затем со всем остальным. Заменить означает распечатать новую строку и все остальное / вторую группу.

UPDATE

Спасибо @franco_b. Вот версия, которая обновляет еще некоторые записи:

select (regexp_replace ('01: 01: 03 ',' ([0-9] {2}) (: [0-9] {2}: [0-9] {2}) ',' \ 1 ') :: int + 24) :: text || regexp_replace ('01: 01: 03', '([0-9] {2}) (: [0-9] {2}: [0-9 ] {2}) ',' \ 2 ');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...