sql >> Database teknologi >  >> RDS >> Oracle

Betinget rækkefølge efter klausul

Dette ser ud til at være fejl 5695629, som ser ud til at være hævet mod 10g og ikke ser ud til at være blevet rettet endnu (fra 12cR2; jeg har ikke 18 at spille med endnu), hvilket er usædvanligt.

Du kan undgå det ved at pakke forespørgslen ind i et ydre udvalg, før du bestiller:

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 ;

Men som name og marks er (formentlig) forskellige datatyper - streng og tal - der i stedet får

Du kan konvertere marks til en streng, men hvis du gør det, skal du udfylde den, så sortering af den resulterende streng alfabetisk stadig matcher den numeriske rækkefølge - rodet, men plausibelt, da mærkerne (igen, formentlig - hvis det er en procentdel?) kun kan være op til tre cifre :

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<>fiddle-demo ved hjælp af nogle dummy-data leveret via CTE'er.

Hvis mærkerne kan være mere end tre cifre, skal du ændre formatmasken for at matche den maksimalt mulige længde.

TO_CHAR('NULL') del er også mærkeligt, da det vil give dig den bogstavelige streng "NULL" i navnekolonnen for disse rækker. Da du starter med en streng bogstavelig, er TO_CHAR() del er meningsløst, brug bare 'NULL' AS name direkte. Hvis du rent faktisk vil have det tomt, kan du bare bruge null AS name og det vil matche datatypen for det matchende kolonneudtryk fra den første gren af ​​foreningen (og vil også opfange dens alias). Du kunne eksplicit caste til en strengtype, f.eks. cast(null as varchar2(20)) AS name men der synes ikke at være meget mening.



  1. Søg i XML-kolonne i SQL

  2. AWS MySQL RDS vs AWS DynamoDB

  3. Indsæt i med union all og nextval virker ikke med duplikerede værdier

  4. Sammenføjninger baseret på betingelser i flere tabeller