我知道一个类似的问题exists,但该解决方案在PostgreSQL中不起作用。
我想做什么;创建包含完整邮政编码副本的新列,然后首先将其修剪为扇区,然后将其修剪为区域,最后修剪为区域。即。将邮政编码复制到postcode_sector trim postcode_sector。
TA15 1PL
变为:
TA15 1
TA15
TA
为区域。 我尝试了什么:
在表格中为每个列创建新列,然后;
SELECT postcode_sector FROM postcodes
RTRIM (Left([postcode_sector],(Len([postcode_sector])-2)) + " " +
Right([postcode_sector],3));
引发语法错误;
Select
Postcode,
RTRIM(LEFT(Postcode, PATINDEX('%[0-9]%', Postcode) - 1)) As AreaTest
From postcodes
在PostgresSQL中不能用作PATINDEX函数。从这里开始,我已经研究了使用优秀教程here加强SUBSTRING
函数的替代方法。使用;
SELECT
substring (postcode FROM 1 FOR 6) AS postcode_sector
FROM postcodes;
让我一路走来,我现在有一个TA15 1的列,但由于系统的工作方式,我也有T15 1A。 PostgresSQL中有没有办法计算单元格中的字符数并删除一个?出于更广泛的兴趣,使用TRIM
比SUBSTRING
更快,我在整个邮政编码文件中执行了大约2700万行
答案 0 :(得分:1)
我对英国邮政编码并不熟悉,但根据Wikipedia's format,这应该处理所有情况:
select postcode,
m[1] || m[2] || ' ' || m[3] sector,
m[1] || m[2] district,
m[1] area
from src,
regexp_matches(postcode, '^([A-Z]{1,2})([0-9A-Z]{1,2}) ([0-9])([A-Z]{2})') m
答案 1 :(得分:0)
这似乎是这样做的:
with postcodes (postcode) as (
values ('TA15 1PL')
)
select substring(postcode from '[^0-9]{2}[0-9]+ [0-9]') as sector,
substring(postcode from '[^0-9]{2}[0-9]+') as district,
substring(postcode from '([^0-9]+)') as area
from postcodes;
返回
sector | district | area
-------+----------+-----
TA15 1 | TA15 | TA