Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thứ tự có điều kiện theo mệnh đề

Đâ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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle JDBC PreparedStatement bỏ qua khoảng trống theo dõi

  2. Truy vấn tham số C # cho Oracle - lỗi nghiêm trọng và nguy hiểm!

  3. loại bỏ ký tự đặc biệt biểu thức chính quy

  4. Thay thế CHAR bằng VARCHAR2

  5. Có được phép sử dụng một SELECT bên trong một hàm bảng PL / SQL có kết cấu không?