我们在其中一个迁移项目中遇到了一个非常特殊的行为,我们希望从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
包含字母数字值,一切也能顺利进行!
相比之下,新版本会报告"无效数字"错误。
当我们切换逻辑运算符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
运营商的行为?