ROWNUM
è il modo più sicuro per prevenire le trasformazioni dell'ottimizzatore e garantire la sicurezza del tipo. Usando ROWNUM
fa pensare a Oracle che l'ordine delle righe sia importante e previene cose come il push dei predicati e l'unione delle viste.
select *
from
(
select id, value, rownum --Add ROWNUM for type safety.
from eav
where attr like 'sal%'
)
where to_number(value) > 5000;
Ci sono altri modi per farlo, ma nessuno di questi è affidabile. Non preoccuparti di semplici viste inline, espressioni di tabelle comuni, CASE
, ordinamento dei predicati o suggerimenti. Questi metodi comuni non sono affidabili e li ho visti fallire tutti.
La migliore soluzione a lungo termine è modificare la tabella EAV per avere una colonna diversa per ogni tipo, come descrivo in questa risposta . Risolvi questo problema ora o futuri sviluppatori malediranno il tuo nome quando dovranno scrivere query complesse per evitare errori di digitazione.