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 оператор?

0 ответов

Другие вопросы по тегам