在PostgreSQL中修剪英国邮政编码

时间:2017-03-21 15:53:52

标签: regex postgresql substring trim

我知道一个类似的问题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中有没有办法计算单元格中的字符数并删除一个?出于更广泛的兴趣,使用TRIMSUBSTRING更快,我在整个邮政编码文件中执行了大约2700万行

2 个答案:

答案 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

http://rextester.com/KREPX19406

答案 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