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

Porządkowanie wyników w Oracle przy użyciu mieszanej kolumny varchar, ale liczbowej klauzula gdzie

ORDER BY nie ma nic wspólnego z problemem - przynajmniej nie bezpośrednio.

SQL ogólnie, a Oracle w szczególności, nie obiecują kolejności oceny warunków w WHERE klauzula. Stąd WHERE klauzula nie jest (koniecznie) oceniana w pisemnej kolejności. Obecność ORDER BY może mieć wpływ na kolejność oceny warunków w tym konkretnym przypadku.

Ogólnie rzecz biorąc, mieszanie typów danych w sposób, w jaki to robisz, jest naprawdę złą praktyką. Ale możesz zagwarantować kolejność oceny, używając case :

select *
from   TABLE
where  CLASS = 3 
       'true' = (case when class <> 3 then 'false'
                      when (CODE >= 210 and CODE < 220) or CODE = 291) then 'true'
                 end);

Nie polecam tego robić. Chcę tylko zaznaczyć, że case wymusza kolejność oceny warunków.

Poprawnym rozwiązaniem jest użycie porównań ciągów. W takim przypadku wybrałbym:

select *
from   TABLE
where  CLASS = 3 AND
       CODE in ('210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '291')

Alternatywnie możesz zrobić:

where  CLASS = 3 and length(CODE) = 3 and
       ((CODE >= '210' and CODE < '220') or CODE = '291')

Pamiętaj, że dla dokładności musisz wziąć pod uwagę długość.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź najbardziej potomny węzeł rodzica (dowolny poziom) w Oracle

  2. 12.2 Nowe funkcje RAC/GI

  3. Wstawianie danych do bazy danych Oracle za pomocą php

  4. ORA-29278:Przejściowy błąd SMTP:usługa niedostępna podczas uruchamiania UTL_MAIL

  5. co to jest folder oradiag_<użytkownik>?