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.