ORDER BY
không liên quan gì đến vấn đề - ít nhất là không trực tiếp.
SQL nói chung và Oracle nói riêng, không hứa hẹn gì về thứ tự đánh giá các điều kiện trong WHERE
mệnh đề. Do đó, WHERE
mệnh đề không (nhất thiết) được đánh giá theo thứ tự đã viết. Sự hiện diện của ORDER BY
có thể ảnh hưởng đến thứ tự đánh giá các điều kiện trong trường hợp cụ thể này.
Nói chung, việc trộn các kiểu dữ liệu theo cách mà bạn đang làm là thực sự không tốt. Tuy nhiên, bạn có thể đảm bảo thứ tự đánh giá bằng cách sử dụng case
:
select *
from TABLE
where CLASS = 3
'true' = (case when class <> 3 then 'false'
when (CODE >= 210 and CODE < 220) or CODE = 291) then 'true'
end);
Tôi không khuyên bạn nên làm điều này. Tôi chỉ muốn chỉ ra rằng case
bắt buộc trình tự đánh giá các điều kiện.
Giải pháp chính xác là sử dụng so sánh chuỗi. Trong trường hợp này, tôi sẽ sử dụng:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Ngoài ra, bạn có thể làm:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Lưu ý rằng để chính xác, bạn cần phải tính đến độ dài.