Zdá se, že jde o chybu 5695629, která, jak se zdá, byla vznesena proti 10g a zdá se, že ještě nebyla opravena (od 12cR2; zatím nemám 18 na hraní), což je neobvyklé.
Můžete se tomu vyhnout tak, že před objednáním zabalíte dotaz do vnějšího výběru:
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 ;
Ale jako name
a marks
jsou (pravděpodobně) různé datové typy – řetězec a číslo – které místo toho dostanou
Můžete převést marks
do řetězce, ale pokud tak učiníte, musíte jej vyplnit, aby řazení výsledného řetězce podle abecedy stále odpovídalo číselnému pořadí - chaotické, ale věrohodné, protože značky mohou (opět pravděpodobně - pokud jde o procenta?) být maximálně třímístné :
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<>ukázka houslí pomocí některých fiktivních dat poskytovaných prostřednictvím CTE.
Pokud mohou mít značky více než tři číslice, změňte masku formátu tak, aby odpovídala maximální možné délce.
TO_CHAR('NULL')
část je také lichá, protože to vám dá doslovný řetězec "NULL" ve sloupci názvu pro tyto řádky. Protože začínáte řetězcovým literálem, TO_CHAR()
část je zbytečná, stačí použít 'NULL' AS name
přímo. Pokud skutečně chcete, aby byl prázdný, můžete použít null AS name
a bude se shodovat s datovým typem odpovídajícího sloupcového výrazu z první větve sjednocení (a zvedne i jeho alias). Můžete explicitně přetypovat na typ řetězce, např. cast(null as varchar2(20)) AS name
ale zdá se, že to nemá moc smysl.