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

时间:2018-09-23 01:59:43

标签: string null amazon-redshift is-empty

即使尝试实施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中看到详细信息来获取有问题的值。

所以我的问题是:

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

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

完全相同吗?

invalid input syntax for type numeric:'',这是我在类似文章中看到的内容?

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

谢谢!

2 个答案:

答案 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 .  

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

希望我的学习经验可以帮助其他人。