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:
gehenselect *
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.