ROWNUM
е най-безопасният начин за предотвратяване на трансформациите на оптимизатора и осигуряване на безопасност на типа. Използване на ROWNUM
кара Oracle да мисли, че редът на редовете има значение и предотвратява неща като натискане на предикат и обединяване на изгледи.
select *
from
(
select id, value, rownum --Add ROWNUM for type safety.
from eav
where attr like 'sal%'
)
where to_number(value) > 5000;
Има и други начини да направите това, но никой от тях не е надежден. Не се занимавайте с прости вградени изгледи, общи изрази на таблици, CASE
, подреждане на предикати или подсказки. Тези често срещани методи не са надеждни и съм ги виждал неуспешни.
Най-доброто дългосрочно решение е да промените EAV таблицата, за да има различна колона за всеки тип, както описвам в този отговор . Поправете това сега или бъдещите разработчици ще проклинат името ви, когато трябва да пишат сложни заявки, за да избегнат грешки при въвеждане.