【问题标题】:ERROR: invalid input syntax for type numeric: " "错误:数字类型的输入语法无效:“”
【发布时间】:2020-10-27 02:50:59
【问题描述】:

在我的一个视图中出现以下错误:

SQL 错误 [22P02]:错误:数字类型的输入语法无效:“”

我认为是因为我使用了以下 COALESCE 命令。

COALESCE(to_number(a_id, '999999999999999'::text), b_id::numeric) AS c_id,
  • a_idtext 类型
  • b_idint4 类型

我应该进行哪些更改才能使其正常工作?

【问题讨论】:

  • 您的列中有时会出现空格。您希望如何处理此案?
  • 真正的问题是:为什么要将数字存储在text 列中。您真的应该将其转换为 intnumeric

标签: sql postgresql


【解决方案1】:

根据错误消息,您的a_id 列中似乎包含非数字值。要标记此类违规记录,您可以尝试:

SELECT *
FROM yourTable
WHERE NOT a_id ~ '^[0-9]+(\.[0-9]+)?$';

如何处理这些数据,由你自己决定。

【讨论】:

  • 我的专栏中没有看到任何这样的值
  • @AbHiNaVAgRaWaL 尝试我更新的答案以查找非数字值(整数或浮点数)。
  • 谢谢。新的实施有效。但是,处理此类问题的方法是什么?
  • @ab: 你的问题的解决方案是不在 text/varchar 列中存储数字
【解决方案2】:

看起来像常见的 Oracle->Postgres 端口错误。对于 Oracle NULL 和空字符串是 +/- 相同的。所以你几乎可以在任何地方使用空字符串。只有 Oracle 具有此功能 - 对于任何其他 SQL 数据库,空字符串不是 NULL。对于 Postgres 也是如此。您不能在 Postgres 中将空字符串转换为数字类型。

注意 - 非常悲惨,所以你的 id 列是数字类型,尽管有数字 - 它可能会很慢,还有其他负面影响。

知道原因后就很容易解决:

COALESCE(to_number(CASE trim(a_id) WHEN '' THEN NULL ELSE a_id END, '999999999999999'::text),
         b_id::numeric) AS c_id,

或者如果有更多的空格,你可以使用

无论如何 - 当您将数据从 Oracle 迁移到 Postgres 时,通常最好立即用 NULL 替换空字符串。

还有另一个性能问题 - 使用 numeric 类型比使用 int4 类型慢。使用numeric 类型作为标识是个坏主意。

【讨论】:

  • 即使使用了 case 条件,我仍然可以看到同样的错误
  • @AbHiNaVAgRaWaL - 是的,因为你有一个空格,这不是空字符串。我修改了回复
  • @AbHiNaVAgRaWaL - 当然不,在这种情况下,你应该用空字符串替换空格 - 但它是信号,所以输入数据错误,应该先清理
  • @PavelStehule 。 . .我不会将 Oracle 对 '' 的重新定义描述为 NULL 违反标准的“功能”。 “Bug”似乎是一个更贴切的描述。
  • @GordonLinoff - 这可能是长时间的讨论:)。当然,这是非概念性的特征。但它有一些优点,而且可能是非常古老的功能,CPU 速度要慢得多,技术人员创造了很多肮脏的把戏。我也不喜欢它,但是这个功能就在这里,我们应该忍受它:)
猜你喜欢
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2012-04-02
  • 1970-01-01
  • 2018-10-07
  • 2023-01-26
  • 2019-02-11
相关资源
最近更新 更多