SQL首次出现一个数字时拆分字符串

时间:2011-09-05 13:01:17

标签: sql postgresql

我在我的数据库中有一个包含街道和房屋号码的字段。我想在新专栏中拆分housenumber。我可以通过像

这样的方式来做到这一点
INSERT INTO mytable(housenumber) VALUES SELECT ??? FROM mytable ?

1 个答案:

答案 0 :(得分:3)

最简单的解决方案似乎使用substring function with regular expressions。我希望你的PostgreSQL版本支持它们。

SELECT adres,
       substring(adres from '^.*?(?=[0-9]|$)') AS street,
       substring(adres from '[0-9].*$') AS housenum
  FROM mytable;
      adres      |  street   |    housenum
-----------------+--------------+-----------------
 some string 12  | some string  | 12
 another 2c      | another      | 2c
 no number       | no number    | 
 99 first number |              | 99 first number
 withnumber1 234 | withnumber   | 1 234
(5 rows)

作为评论中提到的 NullUserException 街道名称可能包含一个数字,不应将其视为门牌号码。在这种情况下,我认为“门牌号”可以定义为以数字开头的子字符串,前面是空格。

在这种情况下,正则表达式会这样:

SELECT adres,
       substring(adres from '^.*?(?=\\s[0-9]|$)') AS street,
       substring(adres from '\\s([0-9].*)$') AS housenum
  FROM mytable;

然后将以不同方式分割示例:

      adres      |    street       | housenum
-----------------+-----------------+-----------
 some string 12  | some string     | 12
 another 2c      | another         | 2c
 no number       | no number       | 
 99 first number | 99 first number | 
 withnumber1 234 | withnumber1     | 234
(5 rows)