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

Urutan bersyarat berdasarkan klausa

Tampaknya ini adalah bug 5695629, yang tampaknya telah ditingkatkan melawan 10g dan tampaknya belum diperbaiki (mulai 12cR2; saya belum memiliki 18 untuk dimainkan), yang tidak biasa.

Anda dapat menghindarinya dengan membungkus kueri dalam pilihan luar sebelum memesan:

select name, grade, marks
from
(
    SELECT
        name, grade, marks
    FROM
        students, grades
    WHERE
        min_mark <= marks
        AND   marks <= max_mark
        AND   marks >= 70
    UNION
    SELECT
        TO_CHAR('NULL') AS name, grade, marks
    FROM
        students, grades
    WHERE
        min_mark <= marks
        AND   marks <= max_mark
        AND   marks <= 69
)
order by grade desc,case when grade >= 1 
                     then  name 
                     when grade < 1 
                     then  marks
                     end ;

Tapi sebagai name dan marks adalah (mungkin) tipe data yang berbeda - string dan angka - yang akan mendapatkan

Anda dapat mengonversi marks ke string, tetapi jika Anda melakukannya, maka Anda perlu melapisinya sehingga menyortir string yang dihasilkan menurut abjad masih cocok dengan urutan numerik - berantakan tetapi masuk akal karena tanda dapat (sekali lagi, mungkin - jika itu persentase?) Hanya sampai tiga digit :

select name, grade, marks
from
(
    ...
    <the main part of your query here as a subquery, as above>
    ...
)
order by grade desc,case when grade >= 8 
                     then  name 
                     when grade < 8 
                     then  to_char(marks, 'FM000')
                     end ;

db<>demo biola menggunakan beberapa data dummy yang disediakan melalui CTE.

Jika tanda bisa lebih dari tiga digit, ubah format mask agar sesuai dengan panjang maksimum yang mungkin.

TO_CHAR('NULL') bagian juga aneh karena itu akan memberi Anda string literal "NULL" di kolom nama untuk baris tersebut. Karena Anda mulai dengan string literal TO_CHAR() bagian tidak ada gunanya, cukup gunakan 'NULL' AS name secara langsung. Jika Anda benar-benar ingin kosong maka Anda bisa menggunakan null AS name dan itu akan cocok dengan tipe data dari ekspresi kolom yang cocok dari cabang pertama serikat (dan akan mengambil aliasnya juga). Anda dapat secara eksplisit melemparkan ke tipe string, mis. cast(null as varchar2(20)) AS name tapi sepertinya tidak ada gunanya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-12154:TNS:tidak dapat menyelesaikan pengidentifikasi koneksi yang ditentukan

  2. Caching urutan Oracle

  3. PHP oci_connect() TNS:tidak dapat menyelesaikan pengidentifikasi koneksi (ORA-12154)

  4. meneruskan objek dari Java ke prosedur Oracle

  5. Bagaimana cara memasukkan karakter khusus seperti &di database Oracle?