【问题标题】:Extract first numeric part of field提取字段的第一个数字部分
【发布时间】:2020-07-16 21:56:52
【问题描述】:

我有一个用于地址的数据库 (Postgres 7.4) 字段

示例数据

    address            |    zip
-----------------------+-------------+
123 main street        |    12345
-----------------------+-------------+
3 where road           |    12345
-----------------------+-------------+
South 3 where road     |    12345

查询

SELECT *
FROM tbl
WHERE zip = 12345
AND address ILIKE '3%'

我得到了所有,但我不想要 123 大街

SELECT *
FROM tbl
WHERE zip = 12345
AND address ILIKE '123%'

我得到了我想要的结果

我的问题是如何匹配地址的数字部分?

【问题讨论】:

  • postgre 是否支持REGEX?我知道 MySQL 可以,但我不太确定 postgre。
  • 是的,但这是 Postgres 的旧版本,所以我会受到限制 postgresql.org/docs/7.4/static/functions-matching.html
  • 感谢您的澄清。我不太确定。只是一个想法——如果你只是想匹配一个固定的数字,为什么不做第二个查询呢?还是您在寻找开头有(出)数字的行?
  • 另外,考虑升级到更新的版本。 7.4 是古老的
  • @Polynomial:不是no such thing as "postgre"

标签: sql postgresql split numeric


【解决方案1】:
SELECT substring(address, '^\\d+') AS heading_number
FROM   tbl
WHERE  zip = 12345
AND    address ILIKE '3%'

从字符串的开头返回 1 个或多个数字。
如果您想要字符串中的第一个数字序列而不是开头的序列,请省略锚点^。示例:

SELECT substring('South 13rd street 3452435 foo', '\\d+');

阅读手册中的substring()regular expressions
在较新的版本(8.0+,带有standard_conforming_strings = on)中,像这样使用escape string syntax

SELECT substring('South 13rd street 3452435 foo', E'\\d+');

或者只是:

SELECT substring('South 13rd street 3452435 foo', '\d+');

【讨论】:

  • 我得到类型“e”不存在。如果我删除 E 它似乎工作,仍在测试
  • @PhillPafford:啊,E for escape string syntax 被引入了 8.0(我认为),别管它了
  • 如果数字前面有一个单词,比如 South 3rd Street,这仍然有效吗?
  • @PhillPafford:查看修改后的答案。
  • 这在地址变为 FLAT 3 时不起作用。不提取 3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多