Non so SQL Server, quindi non posso parlare che.
Data un'espressione a L b
per qualche operatore logico L
, non v'è alcuna garanzia che a
saranno valutate prima o dopo b
o addirittura che sia a
e b
saranno valutate:
Expression Evaluation Rules
L' l'ordine di valutazione delle sottoespressioni non è definito. In particolare, gli input di un operatore o di una funzione non sono necessariamente valutati da sinistra a destra o in qualsiasi altro ordine fisso.
Inoltre, se il risultato di un'espressione può essere determinata valutando solo alcune parti di esso, poi altre sottoespressioni potrebbero non essere valutati affatto.
[...]
Si noti che questo non è lo stesso del "cortocircuito" da sinistra a destra degli operatori booleani che si trova in alcuni linguaggi di programmazione.
Di conseguenza, non è saggio utilizzare le funzioni con effetti collaterali come parte di espressioni complesse. È particolarmente pericoloso fare affidamento sugli effetti collaterali o sull'ordine di valutazione nelle clausole WHERE
e HAVING
, poiché tali clausole sono ampiamente rielaborate come parte dello sviluppo di un piano di esecuzione.
Per quanto espressione della forma:
the_column IS NULL OR the_column < 10
è interessato, non c'è nulla di cui preoccuparsi in quanto NULL < n
è NULL
per tutti n
, anche NULL < NULL
viene valutato come NULL
; inoltre, NULL
non vale così
null is null or null < 10
è solo un modo complicato di dire true or null
e questo è true
indipendentemente dal sub-espressione viene valutata prima.
L'intero "use a CASE" suona per me quasi come SQL carico-cult. Tuttavia, come la maggior parte del culto del cargo, c'è un nucleo nascosto sotto il carico; appena sotto il mio primo estratto dal manuale di PostgreSQL, troverete questo:
Quando è essenziale per forzare ordine di valutazione, un CASE
costrutto (vedi Sezione 9.16) può essere utilizzato. Ad esempio, questo è un modo inaffidabile di cercare di evitare la divisione per zero in una clausola WHERE
:
SELECT ... WHERE x > 0 AND y/x > 1.5;
Ma questo è sicuro:
SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;
Quindi, se avete bisogno di guardia contro un condizione che solleverà un'eccezione o avere altri effetti collaterali, quindi è necessario utilizzare un CASE
per controllare l'ordine di valutazione come CASE
è evaluated in order:
Ogni condizione è un'espressione che restituisce un risultato boolean
. Se il risultato della condizione è true, il valore dell'espressione CASE
è che segue la condizione e il resto dell'espressione CASE
non viene elaborato. Se il risultato della condizione non è vero, tutte le successive clausole WHEN vengono esaminate nello stesso modo.
Quindi, dato queste:
case when A then Ra
when B then Rb
when C then Rc
...
A
è garantito da valutare prima di B
, B
prima C
, ecc e la valutazione si ferma non appena una delle condizioni restituisce un valore vero.
In sintesi, un CASE
cortocircuiti senza ma né AND
né OR
corto circuito in modo che solo bisogno di utilizzare un CASE
quando è necessario per la protezione contro gli effetti collaterali.
Forse stavano parlando di AND? Dal momento che null AND qualsiasi cosa è nullo, è spesso necessaria la coalesce o un caso in cui le espressioni possono contenere termini nulli. –