我有一个最多包含9个逗号分隔值的字段,每个值都有一个字符串值和一个用冒号分隔的数字值。解析它们之后,所有介于0和1之间的所有值都将被设置为整数,而不是强制转换为数字。这个问题显然与数据类型有关,但是我不确定是什么原因或如何修复它。问题仅存在于case语句中,split_part函数似乎运行良好。
我尝试过的事情:
nvl(split_part(one,':',2),0)
=文本类型和整数不能匹配
nvl(split_part(one,':',2)::numeric,0)
=>数值类型的输入语法无效
大量其他转换/转换变体
(CASE WHEN split_part(one,':',2) = '' THEN 0::numeric ELSE split_part(one,':',2)::numeric END)::numeric
=>运行但得到的int值为0
在case语句之外使用split_part函数时,它确实可以正常工作。但是,对于空值,我需要结果为零。
split_part(one,':',2)
=> 0.02068278096187390979(预期结果)
运行上面的代码时,我得到零,但是期望0.02068278096187390979
字段“ one”在split_part函数之前具有以下值“ xyz:0.02068278096187390979”。
示例:
create table test(one varchar);
insert into test values('XYZ: 0.50000000000000000000')
select
one ,split_part(one,':',2) as correct_value_for_those_that_are_not_null ,
case
when split_part(one,':',2) = '' then null
else split_part(one,':',2)::numeric
end::numeric as this_one_is_the_problem
from test
答案 0 :(得分:0)
但是,但是,对于空值,我需要结果为零。
您的示例根本不处理NULL
值。仅解决空字符串(''
)。
要用0
可靠,有效地替换 且不会出现转换问题:
SELECT part1, CASE WHEN part2 <> '' THEN part2::numeric ELSE numeric '0' END AS part2
FROM (
SELECT split_part(one, ':', 1) AS part1
, split_part(one, ':', 2) AS part2
FROM test
) sub;
请参阅:
还要注意,所有SQL CASE
分支必须都同意一种通用的数据类型。过去在确定结果类型的逻辑上进行了微小的调整,因此Postgres的版本可能会在极端情况下起作用。现在不记得详细信息了。
nvl()
不是Postgres函数。您可能是说COALESCE
。手册:
此SQL标准功能提供的功能类似于
NVL
和IFNULL
,在其他一些数据库系统中使用。