转换为 int 而不是十进制?

问题描述 投票:0回答:1

我的字段最多包含 9 个逗号分隔值,每个值都有一个字符串值和一个用冒号分隔的数值。解析它们后,0 到 1 之间的所有值都被设置为整数而不是数字。该问题显然与数据类型有关,但我不确定导致该问题的原因或如何修复它。问题仅存在于 case 语句中, split_part 函数似乎工作完美。

我尝试过的事情:

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

  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

在 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
postgresql types null string-parsing coalesce
1个回答
1
投票

但是,对于空值,我需要结果为零。

不过,您的示例不处理

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
的功能,这些功能在其他一些数据库系统中使用。

© www.soinside.com 2019 - 2024. All rights reserved.