Dette ser ud til at være fejl 5695629, som ser ud til at være hævet mod 10g og ikke ser ud til at være blevet rettet endnu (fra 12cR2; jeg har ikke 18 at spille med endnu), hvilket er usædvanligt.
Du kan undgå det ved at pakke forespørgslen ind i et ydre udvalg, før du bestiller:
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 ;
Men som name
og marks
er (formentlig) forskellige datatyper - streng og tal - der i stedet får
Du kan konvertere marks
til en streng, men hvis du gør det, skal du udfylde den, så sortering af den resulterende streng alfabetisk stadig matcher den numeriske rækkefølge - rodet, men plausibelt, da mærkerne (igen, formentlig - hvis det er en procentdel?) kun kan være op til tre cifre :
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<>fiddle-demo ved hjælp af nogle dummy-data leveret via CTE'er.
Hvis mærkerne kan være mere end tre cifre, skal du ændre formatmasken for at matche den maksimalt mulige længde.
TO_CHAR('NULL')
del er også mærkeligt, da det vil give dig den bogstavelige streng "NULL" i navnekolonnen for disse rækker. Da du starter med en streng bogstavelig, er TO_CHAR()
del er meningsløst, brug bare 'NULL' AS name
direkte. Hvis du rent faktisk vil have det tomt, kan du bare bruge null AS name
og det vil matche datatypen for det matchende kolonneudtryk fra den første gren af foreningen (og vil også opfange dens alias). Du kunne eksplicit caste til en strengtype, f.eks. cast(null as varchar2(20)) AS name
men der synes ikke at være meget mening.