从PostgreSQL中的字段中提取数字

时间:2016-11-12 15:36:45

标签: regex postgresql conditional case regexp-replace

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

以下是示例:

example

SQL Fiddle.

我厌倦了这句话:

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

但是我在显式转换中遇到错误:

error

3 个答案:

答案 0 :(得分:21)

简单地:

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

\D是“非数字”的班级简写 您需要第4个参数'g'(用于“全局”)来替换所有次出现。
Details in the manual.

但为什么Postgres 8.4? Consider upgrading to a modern version.

考虑过时版本的陷阱:

答案 1 :(得分:1)

我想你想要这样的东西:

select (case when regexp_replace(po_number, '[^\w],.-+\?/', '') ~ '^[0-9]+$'
             then regexp_replace(po_number, '[^\w],.-+\?/', '')::numeric
        end) as po_number_new 
from test;

也就是说,您需要在替换后对字符串进行转换。

注意:这假定"数字"只是一串数字。

答案 2 :(得分:1)

我将用来确定po_number字段是否包含数字的逻辑是,在尝试删除数字时,其长度应该减少。

如果是,则应从[^\d]列中删除所有非数字(po_number)。否则,应返回NULL

select case when char_length(regexp_replace(po_number, '\d', '', 'g')) < char_length(po_number)
            then regexp_replace(po_number, '[^0-9]', '', 'g')
            else null
       end as po_number_new
from test