ORDER BY
tidak ada hubungannya dengan masalah -- setidaknya tidak secara langsung.
SQL pada umumnya, dan Oracle pada khususnya, tidak membuat janji tentang urutan evaluasi kondisi di WHERE
ayat. Oleh karena itu, WHERE
klausa tidak (harus) dievaluasi dalam urutan tertulis. Kehadiran ORDER BY
dapat mempengaruhi urutan evaluasi kondisi dalam kasus khusus ini.
Secara umum, ini adalah praktik yang sangat buruk untuk mencampur tipe data, seperti yang Anda lakukan. Namun, Anda dapat menjamin urutan evaluasi dengan menggunakan 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);
Saya tidak menyarankan melakukan ini. Saya hanya ingin menunjukkan bahwa case
memaksa urutan evaluasi kondisi.
Solusi yang benar adalah dengan menggunakan perbandingan string. Dalam hal ini, saya akan menggunakan:
select *
from TABLE
where CLASS = 3 AND
CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')
Atau, Anda dapat melakukan:
where CLASS = 3 and length(CODE) = 3 and
((CODE >= '210' and CODE < '220') or CODE = '291')
Perhatikan bahwa untuk akurasi, Anda perlu memperhitungkan panjangnya.