【问题标题】:When using cast - error: invalid input syntax for type numeric: "" (postgreSQL)使用强制转换时 - 错误:数字类型的输入语法无效:“”(postgreSQL)
【发布时间】:2021-10-24 01:00:11
【问题描述】:

表中的持续时间列以“varchar”数据类型给出。它包含十进制值。所以我试图将 varchar 转换为浮点/数字/十进制/双精度/双精度。但这些都不起作用。为什么它不起作用?

选择runner_id, sum(cast(duration as decimal) '' then 1 的情况 else 0 end) 已交付,count(order_id) as total_orders
来自 t_runner_orders 按 runner_id 分组

【问题讨论】:

  • 如果你所做的只是检查它是否为空,为什么你需要将它转换为十进制!?
  • “但这些都不起作用”到底是什么意思。有没有错误!?如果是这样,那么什么样的错误?
  • 不检查 null 是一种。在我的情况下,我需要对持续时间列进行计算。我收到一个错误:数字类型的输入语法无效。

标签: sql postgresql types


【解决方案1】:

它不起作用的原因是您的持续时间列包含无法转换为数字类型的值。引发错误的具体值是一个空字符串。此外,您不应该将数字类型与空字符串进行比较。

另外,如果您在 CASE 语句中将 varchar 列与字符值进行比较,为什么要尝试将其转换为数字类型?

对于你在这里做的事情,我会写成CASE WHEN duration <> '' THEN 1 ELSE 0 END

如果您确实需要在某些时候将其转换为数字类型,那么执行此操作的方法类似于CASE WHEN duration = '' THEN NULL ELSE cast(duration AS DECIMAL) END(假设空字符串是您的列中唯一不能转换为十进制的值)

【讨论】:

    【解决方案2】:

    问题是您在<> '' 之前执行CASTcast 失败,因为字段中有空字符串。您有多种选择:

    1. 在字段中使用 NULL 而不是 ''。

    2. duration <> ''

    3. 最后可能也是最好的长期解决方案将列类型更改为数字。

    【讨论】:

      【解决方案3】:

      您可以在演员表中使用 NULLIF 将 '' 转换为 null。

      cast(nullif(duration,'') as decimal) is not null
      

      但是这不会解决你的基本问题,即 "varchar' 数据类型。它包含十进制值" 不,它不包含 你希望是十进制值的字符串 strong>,但没有什么禁止将“zero.zero”放入其中 - 显然不是十进制值。我会更进一步@AdrianKlaver。
      3.唯一的长期解决方案将列类型更改为数字。

      【讨论】:

        猜你喜欢
        • 2018-09-29
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多