ROWNUM
est le moyen le plus sûr d'empêcher les transformations de l'optimiseur et d'assurer la sécurité des types. Utilisation de ROWNUM
fait croire à Oracle que l'ordre des lignes est important et empêche des choses comme la poussée de prédicat et la fusion de vues.
select *
from
(
select id, value, rownum --Add ROWNUM for type safety.
from eav
where attr like 'sal%'
)
where to_number(value) > 5000;
Il existe d'autres moyens de le faire, mais aucun d'entre eux n'est fiable. Ne vous embêtez pas avec des vues en ligne simples, des expressions de table courantes, CASE
, l'ordre des prédicats ou les conseils. Ces méthodes courantes ne sont pas fiables et je les ai toutes vues échouer.
La meilleure solution à long terme consiste à modifier la table EAV pour avoir une colonne différente pour chaque type, comme je le décris dans cette réponse . Corrigez cela maintenant ou les futurs développeurs maudiront votre nom lorsqu'ils devront écrire des requêtes complexes pour éviter les erreurs de type.