ROWNUM
er den sikreste måde at forhindre optimeringstransformationer og sikre typesikkerhed. Bruger ROWNUM
får Oracle til at tro, at rækkefølgen har betydning, og forhindrer ting som prædikat-skub og visningssammenlægning.
select *
from
(
select id, value, rownum --Add ROWNUM for type safety.
from eav
where attr like 'sal%'
)
where to_number(value) > 5000;
Der er andre måder at gøre dette på, men ingen af dem er pålidelige. Lad være med at bruge simple indlejrede visninger, almindelige tabeludtryk, CASE
, prædikatrækkefølge eller hints. Disse almindelige metoder er ikke pålidelige, og jeg har set dem alle mislykkes.
Den bedste langsigtede løsning er at ændre EAV-tabellen til at have en anden kolonne for hver type, som jeg beskriver i dette svar . Løs dette nu, ellers vil fremtidige udviklere forbande dit navn, når de skal skrive komplekse forespørgsler for at undgå typefejl.