问题:从 PostgreSQL 中的字段中提取数字

我在 Postgres 8.4 中有一个表,其中列po_number类型为varchar。它存储带有一些特殊字符的字母数字值。我想忽略字符[/alpha/?/$/encoding/.]并检查该列是否包含数字。如果它是一个数字,那么它需要类型转换为数字或传递 null,因为我的输出字段po_number_new是一个数字字段。

下面是示例:

示例

SQL 小提琴。

我厌倦了这句话:

select 
(case when  regexp_replace(po_number,'[^\w],.-+\?/','') then po_number::numeric
else null
end) as po_number_new from test

但是我得到了显式转换的错误:

错误

解答

简单地:

SELECT NULLIF(regexp_replace(po_number, '\D','','g'), '')::numeric AS result
FROM   tbl;

\D是“不是数字”的类简写。

您需要第四个参数'g'(用于“全局”)来替换 all 出现。

手册中有详细说明。

对于要替换的已知的有限字符集,普通的字符串操作函数(如replace()translate())要便宜得多。正则表达式更加通用,在这种情况下,我们希望消除所有 but 数字。有关的:

  • 正则表达式删除字符串中所有出现的多个字符

  • PostgreSQL SELECT 一行中只有字母字符

  • 是否有 regexp_replace 等效于 postgresql 7.4?

但为什么是 Postgres 8.4?考虑升级到现代版本。

考虑过时版本的陷阱:

  • 将 varchar 字符串排序为数字

  • 警告:在字符串文字中非标准使用转义

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐