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

Řazení výsledků Oracle pomocí smíšeného sloupce varchar, ale číselné klauzule where

ORDER BY nemá s problémem nic společného – alespoň ne přímo.

SQL obecně, a Oracle konkrétně, neslibují pořadí hodnocení podmínek v WHERE doložka. Proto WHERE doložka není (nutně) hodnocena v sepsaném pořadí. Přítomnost ORDER BY může ovlivnit pořadí hodnocení podmínek v tomto konkrétním případě.

Obecně je opravdu špatná praxe míchat datové typy způsobem, jakým to děláte. Pořadí hodnocení však můžete zaručit pomocí 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);

Toto nedoporučuji. Chci pouze poukázat na tento case vynucuje pořadí hodnocení podmínek.

Správným řešením je použití porovnávání řetězců. V tomto případě bych zvolil:

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

Případně můžete udělat:

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

Všimněte si, že pro přesnost musíte vzít v úvahu délku.



  1. Maximální délka sloupce JSON v MySQL

  2. php, mysql server odešel

  3. jak překonat ERROR 1045 (28000):Přístup odepřen uživateli 'ODBC'@'localhost' (pomocí hesla:NE) trvale

  4. java.net.InetAddress třída java nerozkládá IP na kontejneru Alpine Docker