ROWNUM
jest najbezpieczniejszym sposobem zapobiegania przekształceniom optymalizatora i zapewnienia bezpieczeństwa typów. Korzystanie z ROWNUM
sprawia, że Oracle uważa, że kolejność wierszy ma znaczenie i zapobiega takim rzeczom, jak wypychanie predykatów i łączenie widoków.
select *
from
(
select id, value, rownum --Add ROWNUM for type safety.
from eav
where attr like 'sal%'
)
where to_number(value) > 5000;
Można to zrobić na inne sposoby, ale żaden z nich nie jest niezawodny. Nie przejmuj się prostymi widokami wbudowanymi, typowymi wyrażeniami tabelowymi, CASE
, kolejność predykatów lub podpowiedzi. Te popularne metody nie są niezawodne i widziałem, jak wszystkie zawiodły.
Najlepszym rozwiązaniem długoterminowym jest zmiana tabeli EAV tak, aby miała inną kolumnę dla każdego typu, jak opisuję w ta odpowiedź . Napraw to teraz, bo przyszli programiści będą przeklinać Twoje imię, gdy będą musieli pisać złożone zapytania, aby uniknąć błędów typowania.