Позитивный взгляд в Postgres 9.5 с использованием regexp_replace

У меня есть такие значения: 1ST, 2ND, FIRST, и я хочу удалить "ST" и "ND" ТОЛЬКО, если на первом месте стоит цифра.

Я использую Postgres 9.5, и у меня позитивный взгляд на работу в SQL Fiddle, но он работает только на 9.6

SELECT ex,
regexp_replace(ex, '(?<=[0-9]+)(TH|ST|ND|RD)', '', 'gi') as test 
FROM t1

Есть ли другой способ сделать это помимо использования оператора CASE, например:

SELECT ex,
(CASE WHEN ex ~ '\d(TH|ST|ND|RD)' THEN regexp_replace (ex, 'TH|ST|ND|RD', '','gi') ELSE ex end) as test_case
FROM t1

Мы ценим любые предложения. Спасибо!

1 ответ

Решение

Вы можете сопоставить и захватить цифру и заменить ее обратной ссылкой на значение. Кроме того, я предлагаю добавить границу слова после суффиксов порядковых чисел, чтобы убедиться, что мы сопоставляем их в конце слова.

SELECT regexp_replace(ex, '([0-9])(?:TH|ST|ND|RD)\y', '\1', 'gi') as test_case FROM t1

Смотрите обновленный SQLFiddle.

CREATE TABLE t1
    (ex varchar)
;

INSERT INTO t1
    (ex)
VALUES
    ('1ST'),
    ('2ND'),
    ('3RD'),
    ('4TH'),
    ('FIRST'),
    ('FOURTH')
 ;

SELECT regexp_replace(ex, '([0-9])(?:TH|ST|ND|RD)\y', '\1', 'gi') as test_case FROM t1

Другие вопросы по тегам