数字类型的无效输入语法:“”

invalid input syntax for type numeric: " "

我在 Redshift 中收到此消息:invalid input syntax for type numeric: " ",即使在尝试实施 SO 中的建议之后也是如此。

我正在尝试将文本转换为数字。

在我的内部联接中,我尝试确保当存在空字符串时首先将正在处理的文本转换为 null,如下所示:

nullif(trim(atl.original_pricev::text),'') as original_price

...我从有关合并的相关 post 中注意到,您必须先将值转换为文本,然后才能尝试取消它。

然后在外连接中,我测试是否有一组有限的可接受字符,如果满足此测试,我会尝试进行 to_number 转换:

,case 
   when regexp_instr(trim(atl.original_price),'[^0-9.$,]')=0 
      then to_number(atl.original_price,'FM999999999D00') 
   else null 
 end as  original_price2

此时我收到上述错误,不幸的是我无法在 datagrip 中看到详细信息以获取违规值。

所以我的问题是:

  1. 我注意到我的错误消息中有一个空 space:

invalid input syntax for type numeric: " "。此错误与

的含义是否完全相同

invalid input syntax for type numeric:'' 这是我在类似 post 中看到的??

  1. 当然:我做错了什么?

谢谢!

如果没有一些数据和完整的代码来尝试重现示例,很难确定,但正如评论中提到的,最可能的原因是您正在使用的 to_number() 函数。

在前面的代码片段中,您将 original_price 转换为文本(字符串),然后在值为 NULL 时替换空字符串 ('')。在空字符串上调用 to_number() 函数将给出所描述的错误。

没有完整的 SQL 语句,不清楚为什么要将 nullif() 函数放在 "inner join" 中的 original_price 周围,或者 CASE 语句是否真的在外连接子句或查询返回的列之一。但是,您也许可以更改 nullif() 以替换可以转换为数字的值,例如'0.00' 而不是 ''。

抱歉,我无法分享真实数据。我整个周末都在测试小集,试图找出错误。我发现错误是由输入字符串没有数字引起的,这是我的正则表达式过滤器允许的:

when regexp_instr(trim(atl.original_price),'[^0-9.$,]') . 

我错误地认为像“$”这样的非数字字符串会计算为 NULL,然后 to_number 函数会 = NULL。但是从实验来看,它似乎在字符串中的某处至少需要一个数字。否则它会在 运行 to_number 格式化和阻塞之前将字符串参数减少为空字符串。

例如 select to_number(trim(''::text),'FM999999999999D00') 将计算为 1 但 select to_number(trim('$A'::text),'FM999999999999D00') 将抛出空字符串错误。

我的解决方法是在我的初始过滤器中添加一个额外的正则表达式:

and regexp_instr(atl.original_price2,'[0-9]')>0 .  

这样可以确保字符串中至少有一个数字,然后空字符串错误就消失了。

希望我的学习经验对其他人有所帮助。