数字类型的无效输入语法:“”
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 中看到详细信息以获取违规值。
所以我的问题是:
- 我注意到我的错误消息中有一个空 space:
invalid input syntax for type numeric: " "
。此错误与
的含义是否完全相同
invalid input syntax for type numeric:''
这是我在类似 post 中看到的??
- 当然:我做错了什么?
谢谢!
如果没有一些数据和完整的代码来尝试重现示例,很难确定,但正如评论中提到的,最可能的原因是您正在使用的 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 .
这样可以确保字符串中至少有一个数字,然后空字符串错误就消失了。
希望我的学习经验对其他人有所帮助。
我在 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 中看到详细信息以获取违规值。
所以我的问题是:
- 我注意到我的错误消息中有一个空 space:
invalid input syntax for type numeric: " "
。此错误与
invalid input syntax for type numeric:''
这是我在类似 post 中看到的??
- 当然:我做错了什么?
谢谢!
如果没有一些数据和完整的代码来尝试重现示例,很难确定,但正如评论中提到的,最可能的原因是您正在使用的 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 .
这样可以确保字符串中至少有一个数字,然后空字符串错误就消失了。
希望我的学习经验对其他人有所帮助。