从PostgreSQL中的字段中提取数字

use*_*020 12 regex postgresql conditional case regexp-replace

我在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
Run Code Online (Sandbox Code Playgroud)

但是我为显式转换得到了一个错误:

错误

Erw*_*ter 27

只是:

SELECT NULLIF(regexp_replace(po_number, '\D','','g'), '')::numeric AS result
FROM   tbl;
Run Code Online (Sandbox Code Playgroud)

\D是"不是数字"的班级简写.
并且您需要第4个参数'g'(用于"全局")来替换所有出现的事件.
手册中的详细信息.

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

考虑过时版本的陷阱: