これはバグ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
を変換できます 文字列に変換しますが、そうする場合は、結果の文字列をアルファベット順に並べ替えても番号の順序に一致するようにパディングする必要があります-マークは(おそらく-パーセンテージの場合は?)最大3桁である可能性があるため、厄介ですがもっともらしいです:
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<>フィドルデモ CTEを介して提供されるダミーデータを使用します。
マークが3桁を超える可能性がある場合は、可能な最大長に一致するようにフォーマットマスクを変更してください。
TO_CHAR('NULL')
これらの行の名前列にリテラル文字列「NULL」が表示されるため、一部も奇妙です。文字列リテラルで開始するため、TO_CHAR()
一部は無意味です。'NULL' AS name
を使用してください。 直接。実際に空白にしたい場合は、null AS name
を使用できます。 そして、それはユニオンの最初のブランチからの一致する列式のデータ型と一致します(そしてそのエイリアスも取得します)。文字列型に明示的にキャストできます。 cast(null as varchar2(20)) AS name
しかし、あまり意味がないようです。