首页 > 解决方案 > 不要提取错误的子字符串/数字

问题描述

我正在使用 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);摆脱出现两次的数字”。

标签: regexstringpostgresqlsubstring

解决方案


你快到了。

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

推荐阅读