Oracle
 sql >> база данни >  >> RDS >> Oracle

Условен ред по клауза

Това изглежда е грешка 5695629, която изглежда е повдигната срещу 10g и изглежда все още не е коригирана (от 12cR2; все още нямам 18, с които да играя), което е необичайно.

Можете да го избегнете, като опаковате заявката във външна селекция, преди да поръчате:

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 ;

Но като name и marks са (вероятно) различни типове данни - низ и число - които вместо това ще получат

Можете да конвертирате marks към низ, но ако го направите, тогава трябва да го допълните, така че сортирането на резултантния низ по азбучен ред все още да съвпада с числовия ред - объркано, но правдоподобно, тъй като знаците могат (отново, предполага се - ако е процент?) да бъдат само до три цифри :

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 използвайки някои фиктивни данни, предоставени чрез CTE.

Ако знаците могат да бъдат повече от три цифри, тогава променете маската на формат, за да съответства на максималната възможна дължина.

TO_CHAR('NULL') част също е странно, тъй като ще ви даде буквалния низ "NULL" в колоната с имена за тези редове. Тъй като започвате с низов литерал TO_CHAR() част е безсмислена, просто използвайте 'NULL' AS name директно. Ако наистина искате да е празно, можете просто да използвате null AS name и ще съответства на типа данни на съвпадащия израз на колона от първия клон на обединението (и ще вземе неговия псевдоним също). Можете изрично да прехвърлите към тип низ, напр. cast(null as varchar2(20)) AS name но изглежда няма много смисъл.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Курсорът в процедурата връща повече стойности от заявката

  2. Инсталиране на GCC на Oracle Solaris 11

  3. Как да използвате изчислена колона за изчисляване на друга колона в същия изглед

  4. Името ORA-00955 вече се използва от съществуващ обект

  5. Когато проектирате бази данни, какъв е предпочитаният начин за съхраняване на множество стойности true/false?