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



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

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

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

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

。我从一篇关于合并的相关帖子中注意到,您必须先将值转换为文本,然后才能尝试将其 nullif。

然后在外部联接中,我测试以查看是否有一组有限的可接受字符,如果满足此测试,我将尝试进行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. 我注意到我的错误消息中有一个空白区域:

invalid input syntax for type numeric: " ".此错误是否具有与

invalid input syntax for type numeric:''我在类似帖子中看到的是什么??

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

谢谢!

抱歉,我无法共享真实数据。 我花了周末的时间测试小集合,试图捕获错误。 我发现错误是由没有数字的输入字符串引起的,这是我的正则表达式过滤器允许的:

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

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

例如,select to_number(trim('$1'::text),'FM999999999999D00')的计算结果为 1,但select to_number(trim('$A'::text),'FM999999999999D00')将引发空字符串错误。

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

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

这可确保字符串中至少有一个数字,之后空字符串错误消失。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新