ROWNUM
là cách an toàn nhất để ngăn chặn chuyển đổi trình tối ưu hóa và đảm bảo an toàn cho kiểu. Sử dụng ROWNUM
khiến Oracle nghĩ rằng thứ tự hàng quan trọng và ngăn chặn những thứ như đẩy vị từ và hợp nhất xem.
select *
from
(
select id, value, rownum --Add ROWNUM for type safety.
from eav
where attr like 'sal%'
)
where to_number(value) > 5000;
Có nhiều cách khác để làm điều này nhưng không có cách nào trong số đó là đáng tin cậy. Đừng bận tâm với các dạng xem nội tuyến đơn giản, các biểu thức bảng phổ biến, CASE
, thứ tự vị ngữ, hoặc gợi ý. Những phương pháp phổ biến đó không đáng tin cậy và tôi đã thấy tất cả chúng đều thất bại.
Giải pháp lâu dài tốt nhất là thay đổi bảng EAV để có một cột khác cho từng loại, như tôi mô tả trong câu trả lời này . Hãy sửa lỗi này ngay bây giờ nếu không các nhà phát triển trong tương lai sẽ nguyền rủa tên bạn khi họ phải viết các truy vấn phức tạp để tránh lỗi nhập.