2012-12-25 9 views
6

Ho un codice PL/SQL come:PL/SQL "tra xey" non funziona, se y <x. Perché?

case when column between 201203 and 201201 
then other_column 
end 

So che ci sono valori nella colonna che sono 201203. Così codice dovrebbe restituire alcuni valori. Ma non è stato fino a quando ho corretto come:

case when column between 201201 and 201203 
then other_column 
end 

Perché tra parole chiave funziona così? Come è implementato su database Oracle?

risposta

9

Questo comportamento è ANSI SQL.

expr1 BETWEEN expr2 AND expr3 

traduce

expr2 <= expr1 AND expr1 <= expr3 
+1

Su un sidenote .. Ho provato a collegare lo standard definito in ISO 13249-1. Sfortunatamente, ANSI e ISO vogliono soldi per il PDF e non ho trovato una copia pubblica - wow ... immagina, RFC prenderebbe soldi, Internet sarebbe un caos senza standard http://www.iso.org /iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=38649 e http://webstore.ansi.org/FindStandards.aspx?SearchString=13249-1&SearchOption=0&PageNum=0&SearchTermsArray=null%7c13249-1%7cnull#. UNnboG_X5yJ –

+1

Questo è indicato [nella documentazione Oracle] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/conditions011.htm), che dice anche esplicitamente che "Se expr3

1

Considerare

val1 between val2 and val3 

come

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

Allora che cosa abbiamo?

column between 201203 and 201201 

è l'equivalente di

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

Se il valore è column, diciamo, 201202 quindi la prima condizione (column >= 201203) sarà falso e il secondo sarà anche falso. Questo è il motivo per cui non ottieni alcun risultato. Find out more.

1

In Between Clause, il valore sempre inferiore viene prima anziché il valore più alto.

Es: - tra 100 e 200

invece di

tra 200 e 100

Quando Query parser analizzare tra 100 e 200 allora sarebbe così: -

X> = 100 E X < = 200

Problemi correlati