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表更改为每种类型都具有不同的列,如我在此答案中所述。立即解决此问题,否则将来的开发人员在不得不编写复杂的查询以避免类型错误时将诅咒您的名字。