在我们想要从 Oracle 11.1 迁移到 11.2 的迁移项目中,我们面临一个非常特殊的行为。
旧查询采用以下格式:
SELECT * FROM TABLE_A, TABLE_X WHERE
(NVL(TO_NUMBER(COL_A), 0) > 0 OR NVL(TO_NUMBER(COL_B), 0) > 0)
AND
(INSTR('Dummy', COL_X) > 0 OR COL_X_ID = 100)
AND COL_A_ID = COL_X_ID
在 Oracle 11.1 中,即使列COL_B
包含字母数字值,一切都可以顺利进行!
甲骨文 11.2
相比之下,新版本报告了“无效号码”错误。
当我们切换逻辑运算符的项目时,AND
它也适用于这个版本:
SELECT * FROM TABLE_A, TABLE_X WHERE
(INSTR('Dummy', COL_X) > 0 OR COL_X_ID = 100)
AND
(NVL(TO_NUMBER(COL_A), 0) > 0 OR NVL(TO_NUMBER(COL_B), 0) > 0)
AND COL_A_ID = COL_X_ID
不幸的是,我们有数百个查询和重构查询的资源短缺。
问题
是否有标志确定AND
操作员的行为?