Wygląda na to, że jest to błąd 5695629, który wydaje się być podniesiony przeciwko 10g i wydaje się, że nie został jeszcze naprawiony (od 12cR2; nie mam jeszcze 18 do gry), co jest niezwykłe.
Możesz tego uniknąć, umieszczając zapytanie w zewnętrznym zaznaczeniu przed złożeniem zamówienia:
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
i marks
są (przypuszczalnie) różnymi typami danych — ciągiem i liczbą — które zamiast tego otrzymają
Możesz przekonwertować marks
do ciągu, ale jeśli to zrobisz, musisz go uzupełnić, więc sortowanie wynikowego ciągu alfabetycznie nadal pasuje do kolejności numerycznej - niechlujny, ale prawdopodobny, ponieważ znaki mogą (znowu, przypuszczalnie - jeśli jest to procent?) mieć tylko trzy cyfry :
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<>demonstracja skrzypiec przy użyciu niektórych fikcyjnych danych dostarczonych przez CTE.
Jeśli znaki mogą mieć więcej niż trzy cyfry, zmień maskę formatu, aby odpowiadała maksymalnej możliwej długości.
TO_CHAR('NULL')
część jest również nieparzysta, ponieważ da ci to dosłowny ciąg "NULL" w kolumnie nazwy dla tych wierszy. Ponieważ zaczynasz od literału ciągu, TO_CHAR()
część jest bezcelowa, po prostu użyj 'NULL' AS name
bezpośrednio. Jeśli rzeczywiście chcesz, aby był pusty, możesz po prostu użyć null AS name
i będzie pasował do typu danych pasującego wyrażenia kolumny z pierwszej gałęzi unii (i pobierze również jego alias). Mógłbyś jawnie rzutować do typu string, np. cast(null as varchar2(20)) AS name
ale wydaje się, że nie ma to większego sensu.