使用 regexp_replace 在 Postgres 9.5 中进行正面回顾
Positive Lookbehind in Postgres 9.5 using 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
如有任何建议,我们将不胜感激。谢谢!
您可以匹配并捕获数字并替换为对该值的反向引用。另外,我建议在序数后缀后添加一个单词边界,以确保我们在单词末尾匹配它们。
SELECT regexp_replace(ex, '([0-9])(?:TH|ST|ND|RD)\y', '', 'gi') as test_case FROM t1
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', '', 'gi') as test_case FROM t1
我有这样的值: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
如有任何建议,我们将不胜感激。谢谢!
您可以匹配并捕获数字并替换为对该值的反向引用。另外,我建议在序数后缀后添加一个单词边界,以确保我们在单词末尾匹配它们。
SELECT regexp_replace(ex, '([0-9])(?:TH|ST|ND|RD)\y', '', 'gi') as test_case FROM t1
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', '', 'gi') as test_case FROM t1