即使尝试实施SO中的建议,我仍在Redshift中收到此消息:invalid input syntax for type numeric: " "
。
我正在尝试将文本转换为数字。
在我的内部联接中,我尝试确保在有空字符串时首先将要处理的文本转换为null,如下所示:
nullif(trim(atl.original_pricev::text),'') as original_price
...我从合并的相关文章中注意到,您必须先将值转换为文本,然后才能尝试将其无效。
然后在外部联接中,我进行测试以查看是否存在有限的可接受字符集,如果满足此测试,则尝试进行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中看到详细信息来获取有问题的值。
所以我的问题是:
invalid input syntax for type numeric: " "
。此错误的含义与
invalid input syntax for type numeric:''
,这是我在类似文章中看到的内容?
谢谢!
答案 0 :(得分:0)
很难确定没有一些数据和完整的代码来尝试重现该示例,但是正如注释中提到的那样,最可能的原因是您正在使用的to_number()
函数。
在先前的代码片段中,您将original_price转换为文本(字符串),然后如果该值为NULL则替换为空字符串('')。在空字符串上调用to_number()函数将给您描述的错误。
在没有完整的SQL语句的情况下,不清楚为什么将nullif()函数放在“内部联接”中的original_price周围,还是不清楚CASE语句是否真正在外部联接子句中或由以下哪一个返回查询。但是,您可能可以更改nullif()以替换可以转换为数字的值,例如“ 0.00”而不是“。
答案 1 :(得分:0)
抱歉,我无法共享真实数据。我花了一个周末测试小型仪器,以尝试捕获错误。我发现错误是由输入数字没有数字引起的,这是我的正则表达式过滤器所允许的:
when regexp_instr(trim(atl.original_price),'[^0-9.$,]') .
我错误地期望像“ $”这样的非数字字符串将计算为NULL,然后to_number函数将= NULL。但是从实验来看,它似乎至少需要一个数字在字符串中的某处。否则,它将在运行to_number格式和阻塞之前将string参数减小为空字符串。
例如select to_number(trim('$1'::text),'FM999999999999D00')
的计算结果为1,但是select to_number(trim('$A'::text),'FM999999999999D00')
将抛出空字符串错误。
我的解决方法是在我的初始过滤器中添加一个正则表达式:
and regexp_instr(atl.original_price2,'[0-9]')>0 .
这样可以确保在字符串中至少有一个数字,然后空字符串错误就消失了。
希望我的学习经验可以帮助其他人。