Това изглежда е грешка 5695629, която изглежда е повдигната срещу 10g и изглежда все още не е коригирана (от 12cR2; все още нямам 18, с които да играя), което е необичайно.
Можете да го избегнете, като опаковате заявката във външна селекция, преди да поръчате:
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 ;
Но като name
и marks
са (вероятно) различни типове данни - низ и число - които вместо това ще получат
Можете да конвертирате marks
към низ, но ако го направите, тогава трябва да го допълните, така че сортирането на резултантния низ по азбучен ред все още да съвпада с числовия ред - объркано, но правдоподобно, тъй като знаците могат (отново, предполага се - ако е процент?) да бъдат само до три цифри :
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 използвайки някои фиктивни данни, предоставени чрез CTE.
Ако знаците могат да бъдат повече от три цифри, тогава променете маската на формат, за да съответства на максималната възможна дължина.
TO_CHAR('NULL')
част също е странно, тъй като ще ви даде буквалния низ "NULL" в колоната с имена за тези редове. Тъй като започвате с низов литерал TO_CHAR()
част е безсмислена, просто използвайте 'NULL' AS name
директно. Ако наистина искате да е празно, можете просто да използвате null AS name
и ще съответства на типа данни на съвпадащия израз на колона от първия клон на обединението (и ще вземе неговия псевдоним също). Можете изрично да прехвърлите към тип низ, напр. cast(null as varchar2(20)) AS name
но изглежда няма много смисъл.