Oracle: логический оператор И трактуется по-разному в 11.1 и 11.2
Мы сталкиваемся с совершенно особым поведением в одном из наших проектов миграции, когда мы хотим перейти с 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
содержит буквенно-цифровые значения!
Oracle 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
оператор?