Đây dường như là lỗi 5695629, có vẻ như đã được nâng lên so với 10g và dường như vẫn chưa được sửa (kể từ 12cR2; tôi chưa có 18 tuổi để chơi), điều này thật bất thường.
Bạn có thể tránh nó bằng cách đưa truy vấn vào một lựa chọn bên ngoài trước khi đặt hàng:
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 ;
Nhưng là name
và dấu marks
là (có lẽ) các kiểu dữ liệu khác nhau - chuỗi và số - thay vào đó sẽ nhận được
Bạn có thể chuyển đổi các dấu marks
vào một chuỗi, nhưng nếu bạn làm vậy thì bạn cần phải đệm nó để sắp xếp chuỗi kết quả theo thứ tự bảng chữ cái vẫn khớp với thứ tự số - lộn xộn nhưng hợp lý vì các dấu có thể (một lần nữa, có lẽ - nếu là tỷ lệ phần trăm?) chỉ có tối đa ba chữ số :
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 <> bản trình diễn fiddle sử dụng một số dữ liệu giả được cung cấp qua CTE.
Nếu các dấu có thể nhiều hơn ba chữ số thì hãy thay đổi mặt nạ định dạng để phù hợp với độ dài tối đa có thể.
TO_CHAR('NULL')
một phần cũng kỳ lạ vì điều đó sẽ cung cấp cho bạn chuỗi chữ "NULL" trong cột tên cho các hàng đó. Vì bạn bắt đầu bằng một chuỗi ký tự nên TO_CHAR()
một phần là vô nghĩa, chỉ cần sử dụng 'NULL' AS name
trực tiếp. Nếu bạn thực sự muốn nó để trống thì bạn chỉ có thể sử dụng null AS name
và nó sẽ khớp với kiểu dữ liệu của biểu thức cột phù hợp từ nhánh đầu tiên của liên hợp (và cũng sẽ lấy bí danh của nó). Bạn có thể truyền rõ ràng sang một loại chuỗi, ví dụ:cast(null as varchar2(20)) AS name
nhưng dường như không có nhiều điểm.