Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Warunkowe zamówienie według klauzuli

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uporządkuj wiersze przy użyciu kolumn od mniejszej liczby wartości null do braku wartości null

  2. Problem z uruchomieniem pakietu SSIS z Oracle Connection Attunity

  3. Oracle Database Security:Audyt bazy danych

  4. Zamiana System.Data.OracleClient na Oracle.DataAccess (ODP.NET)

  5. Nadmiarowość Oracle RAC N+1