我有这样的陈述。虽然我可以在Oracle 11g中执行此语句并查看结果。但是我的朋友(他也使用Oracle 11g)无法执行此语句。他得到无效的号码错误。我不明白为什么。你可以帮帮我吗?他还尝试将upper_threshold转换为varchar,但它不起作用。
select *
from table
where (lower_threshold <> to_char( 0) or upper_threshold = 0 or upper_threshold is null)
lower_threshold具有varchar类型,上限阈值是整数值。
答案 0 :(得分:0)
ORA-01722: invalid number
。
您说“上限阈值是整数值”但似乎table.upper_threshold
的数据类型更可能是字符串数据类型(VARCHAR2或类似),如table.lower_threshold
。在这种情况下,当您执行这样的过滤器时:
upper_threshold = 0
Oracle实现的是
to_number(upper_threshold) = 0
您没有收到ORA-01722错误,因为表中的所有值都会愉快地转换为数字。你的朋友没那么幸运,他在upper_threshold
栏中有非数字值(空格,字母等)。
教学是,始终使用NUMBER列来存储数字。
“实际上,我们都连接到同一个数据库,同一个表”
基本上就是,如果两个人使用相同的数据对同一个实际表运行相同的SQL,它们将得到相同的结果。所以你们其中一个人必须做出与众不同的事情。可能这是客户端设置的问题,虽然我想不出可能导致ORA-01722错误的环境参数。更有可能的是,你们中的一个正在运行不同的语句或使用不同的表或(如Mathguy所建议的)运行不同的数据集。