转换为int而不是十进制?

时间:2019-05-06 20:15:59

标签: postgresql types null string-parsing coalesce

我有一个最多包含9个逗号分隔值的字段,每个值都有一个字符串值和一个用冒号分隔的数字值。解析它们之后,所有介于0和1之间的所有值都将被设置为整数,而不是强制转换为数字。这个问题显然与数据类型有关,但是我不确定是什么原因或如何修复它。问题仅存在于case语句中,split_part函数似乎运行良好。

我尝试过的事情:

  1. nvl(split_part(one,':',2),0) =文本类型和整数不能匹配

  2. nvl(split_part(one,':',2)::numeric,0) =>数值类型的输入语法无效

  3. 大量其他转换/转换变体

  4. (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

1 个答案:

答案 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标准功能提供的功能类似于NVLIFNULL,在其他一些数据库系统中使用。