我在Postgres 8.4中有一个包含po_number
列varchar
的表格。它存储带有一些特殊字符的字母数字值。我想忽略字符[/alpha/?/$/encoding/.]
并检查列是否包含数字。如果它是一个数字,那么它需要将数字转换为数字或者传递null,因为我的输出字段po_number_new
是一个数字字段。
以下是示例:
我厌倦了这句话:
select
(case when regexp_replace(po_number,'[^\w],.-+\?/','') then po_number::numeric
else null
end) as po_number_new from test
但是我在显式转换中遇到错误:
答案 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