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