我的字段最多包含 9 个逗号分隔值,每个值都有一个字符串值和一个用冒号分隔的数值。解析它们后,0 到 1 之间的所有值都被设置为整数而不是数字。该问题显然与数据类型有关,但我不确定导致该问题的原因或如何修复它。问题仅存在于 case 语句中, split_part 函数似乎工作完美。
我尝试过的事情:
nvl(split_part(one,':',2),0)
= COALESCE 类型文本和整数无法匹配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
在 split_part 函数之前,字段“one”具有以下值“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
但是,对于空值,我需要结果为零。
不过,您的示例不处理
null
值。只有''
。无论如何,用 0
替换 either并且没有选角问题:
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