sql >> Databáze >  >> RDS >> Oracle

Podmíněné pořadí podle doložky

Zdá se, že jde o chybu 5695629, která, jak se zdá, byla vznesena proti 10g a zdá se, že ještě nebyla opravena (od 12cR2; zatím nemám 18 na hraní), což je neobvyklé.

Můžete se tomu vyhnout tak, že před objednáním zabalíte dotaz do vnějšího výběru:

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 a marks jsou (pravděpodobně) různé datové typy – řetězec a číslo – které místo toho dostanou

Můžete převést marks do řetězce, ale pokud tak učiníte, musíte jej vyplnit, aby řazení výsledného řetězce podle abecedy stále odpovídalo číselnému pořadí - chaotické, ale věrohodné, protože značky mohou (opět pravděpodobně - pokud jde o procenta?) být maximálně třímístné :

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<>ukázka houslí pomocí některých fiktivních dat poskytovaných prostřednictvím CTE.

Pokud mohou mít značky více než tři číslice, změňte masku formátu tak, aby odpovídala maximální možné délce.

TO_CHAR('NULL') část je také lichá, protože to vám dá doslovný řetězec "NULL" ve sloupci názvu pro tyto řádky. Protože začínáte řetězcovým literálem, TO_CHAR() část je zbytečná, stačí použít 'NULL' AS name přímo. Pokud skutečně chcete, aby byl prázdný, můžete použít null AS name a bude se shodovat s datovým typem odpovídajícího sloupcového výrazu z první větve sjednocení (a zvedne i jeho alias). Můžete explicitně přetypovat na typ řetězce, např. cast(null as varchar2(20)) AS name ale zdá se, že to nemá moc smysl.



  1. Jak exportovat databázi z instance Amazon RDS MySQL do místní instance?

  2. Zkontrolujte, zda databáze již existuje

  3. Jak předat parametr dotazu mssql v uzlu js

  4. Odstranění dotazu Oracle trvá příliš dlouho