Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle memesan hasil menggunakan kolom varchar campuran tetapi klausa di mana numerik

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.



  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 kondisi kosong untuk memeriksa kondisi ''

  2. Oracle menghapus baris dari beberapa tabel

  3. Bagaimana mengintegrasikan Oracle dan Kafka

  4. bantuan oracle hilang koma

  5. Permintaan tercepat untuk memeriksa keberadaan baris di Oracle?