不要提取错误的子字符串/数字

时间:2018-08-01 16:57:13

标签: regex string postgresql substring

我正在使用PostgreSQL中的地址数据,并且需要提取4位数的邮政编码。

我有一些地址,例如 'UNIT 1503 CENTER RD CLAYTON VIC 3168 1503,AU' 其中“ 3168”对应于我的邮政编码。

我尝试过的所有内容都会提取“ 1503”作为邮政编码,这是错误的。 在其余地址中,不是邮政编码的4位数字(例如“ 1503”)在地址中出现了两次。在大多数情况下,第二个数字位于逗号之前(但我不确定是否所有情况都如此)。

以下代码为我提供了所有4位数字的列表:

select array_to_string(regexp_matches('1503 CENTRE RD CLAYTON VIC 3168 1503, AU', '\m[0-9]{4}\M', 'g'), '')

但是当我更新“ postal_code”列时,仅使用第一行。

我需要一个代码,该代码首先检查是否有多个4位数字。如果是这种情况,我需要实施以下规则(我不知道如何做): “如果字符串中有多个4位数字,则仅提取唯一的数字(3168);除去出现两次的数字”。

1 个答案:

答案 0 :(得分:1)

你快到了。

with t(id,x) as (values
  (1,'1503 CENTRE RD CLAYTON VIC 3168 1503, AU'::text),
  (2,'1111 2222 3333 1111')) 
select id, n[1]
from t, regexp_matches(x, '\m\d{4}\M', 'g') as n 
group by id, n[1]
having count(*) = 1; -- Check for uniqueness