当使用涉及字符串和数值的比较时,我在 Oracle 11g Express 数据库中遇到意外行为。根据Oracle文档,当比较不同数据类型的值时,应该发生隐式转换。
这是我正在运行的 SQL 查询:
SELECT 'TRUE' FROM DUAL WHERE '3' > 20;
根据Oracle的指导方针,字符串“3”应该隐式转换为数字数据类型以进行比较。但是,我观察到数字值 20 似乎没有转换为数字,而是转换为字符串。因此,比较似乎是基于字符串排序而不是数字排序。
我参考了Oracle文档,但找不到对此行为的明确解释。有人可以帮助我理解为什么在这种特定情况下隐式转换没有按预期发生吗?
任何见解或建议将不胜感激。
我希望按照 Oracle 文档中的描述进行隐式转换,其中字符串“3”将转换为数字值以进行比较。然而,观察到的行为表明数值 20 被视为字符串。
不要让自己依赖Oracle的隐式转换,因为没有办法知道它何时会成功实现,何时不会成功。让我们以您的查询为例:
SELECT 'TRUE' FROM DUAL WHERE '3' > 20;
SELECT 'TRUE' FROM DUAL WHERE 20 < '3';
两者都不返回任何行 - 就像 Oracle 隐式地将 char '3' 转换为数字 3
SELECT 'TRUE' FROM DUAL WHERE '3' < 20;
SELECT 'TRUE' FROM DUAL WHERE 20 > '3';
两者都返回 TRUE - 所以看起来再次实现了相同的转换
SELECT 'TRUE' FROM DUAL WHERE '20' + '3' = 23;
答案是正确的。
人们可能会认为隐式转换没有任何问题,但根据我的经验,“ORA-01722:无效数字”错误迟早会弹出。拥有 char 值意味着可以存储其他内容 - 不仅仅是数字,并且您需要一些时间才能发现长期以来一直运行良好的 sql 发生了什么。
因此,比较和操作数字与数字或字符与字符 - 进行您自己的显式转换(处理 char 值中其他内容的可能性) - 按照 Paul W 在评论中的建议使用 To_Char() 或 To_Number() 。