Рассмотрим следующий сценарий.У меня есть таблица (stupid_table
) в схеме, которую я не могу контролировать.Это третье лицо, запрещено.Не обидчивый.Я могу запросить его, но не добавлять индексы или новые таблицы или изменять дизайн.
Каждый столбец в stupid_table
- это VARCHAR2(50 BYTE)
, есть много столбцов, но мне нужны только два из них: row_type
и magic_number
.magic_number
заполняется строковым представлением целого числа, но only , где row_type
установлено на 'DATA'
, мне нужны только магические числа, которые больше нуля.
SELECT TO_NUMBER(magic_number)
FROM stupid_table
WHERE row_type = 'DATA'
AND TO_NUMBER(magic_number) > 0;
Это приводит к ошибке Oracle "недопустимое число", поскольку оптимизатор на основе затрат (CBO) выбирает оценку TO_NUMBER
перед проверкой row_type
, и существует целый ряд строк с другим row_type
и другое использование для поля magic_number
.
ОК, как насчет того, чтобы сначала отфильтровать строки, а затем выполнить сравнение?
SELECT TO_NUMBER(t.magic_number)
FROM (
SELECT magic_number
FROM stupid_table
WHERE row_type = 'DATA'
) t
AND TO_NUMBER(t.magic_number) > 0;
Теперь CBO, похоже, работаетВыяснилось, что запрос довольно прост и игнорирует хитрость, которую я использовал, что дает план запроса, идентичный исходному.заставить Oracle использовать старый оптимизатор на основе правил.Это работает как сон, но в этом нет необходимости, не говоря уже о том, что он использует функцию Oracle, которая больше не поддерживается.
Есть ли лучший способ сделать это?