2012-12-25 13 views
6

mam kodu PL/SQL, takich jak:PL/SQL "między X i Y" nie działa, jeśli y <x. Czemu?

case when column between 201203 and 201201 
then other_column 
end 

Wiem, że istnieją wartości w kolumnie, które są 201203. Tak więc kod powinien powrócić pewne wartości. Ale tak się nie stało, dopóki nie poprawił go tak:

case when column between 201201 and 201203 
then other_column 
end 

Dlaczego między Hasło działa w taki sposób? W jaki sposób jest on wdrażany w bazach danych Oracle?

Odpowiedz

9

To zachowanie ANSI SQL.

expr1 BETWEEN expr2 AND expr3 

przekłada się

expr2 <= expr1 AND expr1 <= expr3 
+1

Na stronie przewodniej .. Próbowałem połączyć standard, który został zdefiniowany w ISO 13249-1. Niestety, każdy z nich, ANSI i ISO, chce pieniędzy na plik PDF, a ja nie znalazłem publicznej kopii - wow ... wyobraźcie sobie, RFC wziąłby pieniądze, internet byłby chaosem bez żadnych standardów http://www.iso.org /iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=38649 i http://webstore.ansi.org/FindStandards.aspx?SearchString=13249-1&SearchOption=0&PageNum=0&SearchTermsArray=null%7c13249-1%7cnull#. UNnboG_X5yJ –

+1

Zostało to również określone [w dokumentacji Oracle] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/conditions011.htm), co również wyraźnie mówi, że "Jeśli wyrażenie 3

1

Rozważmy

val1 between val2 and val3 

jak

(val1 >= val2) and (val1 <= val3) 

Więc co mamy?

column between 201203 and 201201 

jest równoważna

(column >= 201203) and (column <= 201201) 

Jeżeli wartość column jest, powiedzmy, 201.202 to pierwszy warunek (column >= 201203) będzie fałszywe, a drugie będzie również fałszywe. Właśnie dlatego nie uzyskujesz żadnych wyników. Find out more.

1

W klauzuli między wartościami, zawsze niższa wartość pojawia się jako pierwsza zamiast wyższej.

Ex: - pomiędzy 100 i 200

zamiast

między 200 a 100

Kiedy Query Parser parsowania od 100 do 200 wtedy byłoby tak: -

X> = 100 AND X < = 200

Powiązane problemy