Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Reihenfolge von Ergebnissen mit einer gemischten Varchar-Spalte, aber einer numerischen Where-Klausel

Der ORDER BY hat nichts mit dem Problem zu tun – zumindest nicht direkt.

SQL im Allgemeinen und Oracle im Besonderen machen keine Zusagen über die Reihenfolge der Auswertung von Bedingungen in WHERE Klausel. Daher das WHERE Klausel wird nicht (notwendigerweise) in der geschriebenen Reihenfolge ausgewertet. Das Vorhandensein des ORDER BY kann die Reihenfolge der Bewertung der Bedingungen in diesem speziellen Fall beeinflussen.

Im Allgemeinen ist es eine wirklich schlechte Praxis, Datentypen so zu mischen, wie Sie es tun. Sie können jedoch die Reihenfolge der Auswertung garantieren, indem Sie case verwenden :

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);

Ich empfehle dies nicht. Ich möchte nur auf diesen case hinweisen erzwingt die Reihenfolge der Auswertung der Bedingungen.

Die richtige Lösung besteht darin, Zeichenfolgenvergleiche zu verwenden. In diesem Fall würde ich mit:

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

Alternativ können Sie Folgendes tun:

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

Beachten Sie, dass Sie für die Genauigkeit die Länge berücksichtigen müssen.