Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thứ tự kết quả của Oracle bằng cách sử dụng cột varchar hỗn hợp nhưng mệnh đề where là số

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:hợp nhất hai truy vấn khác nhau thành một, LIKE &IN

  2. Trả về thông báo mã lỗi trong Oracle Stored Proc

  3. Sử dụng dịch vụ web và chèn CLOB bằng Node.js vào bảng Cơ sở dữ liệu Oracle

  4. Oracle RAC N + 1 Dự phòng

  5. ORA-00060:phát hiện deadlock trong khi chờ tài nguyên