2015-10-29 6 views
5

In Java,Il motivo o la condizione funziona in modo diverso rispetto a Java e SQL

int a = 10, b = 10;

if (a == 10 || b==10) 
{ 
// first condition (a==10) is true, so it wont check further 
} 

Ma, in SQL,

select * from my table where a = 10 or b = 10; 

--As per my understanding, It should return data only based on a. 
--But it returns both entries. 

Perché?

+4

Questo non è il modo in cui il lavoro affermazioni. Presumo che quello che stai cercando di fare è ottenere tutte le righe dove a = 10 a meno che a! = 10, quindi ottenere tutte le righe con b = 10. –

risposta

2

Si sta descrivendo la terminazione anticipata, ovvero la seconda istruzione viene eseguita solo se la risposta non è già nota, ma non modifica il risultato (a meno che non si esegua un'espressione nella seconda istruzione).

Così a == 10 || b == 10 si tradurrà in qualcosa di cui una, oppure b è 10 - o dove a e b sono 10. O più precisamente ...

a = 10 
b = 10 

O

a = 10 
b = 0 

O

a = 0 
b = 10 

Se capita di essere 10, non è necessario controllare b - ma alcune lingue lo sono ancora.

1

Questo non è un ottimo paragone da fare. Tuttavia, non funziona necessariamente diversamente. Se si dovesse aggiungere

if (a == 10 || b==10) 
{ 
// first condition (a==10) is true, so it wont check further 
// return a or b 
} 

Sarebbe tornare ogni volta in cui una o b è 10. Praticamente la stessa logica dietro l'istruzione SQL.

Il problema è di come si sta interpretando male WHERE, questo sarà infatti tornare ogni record in cui una o b è 10.

1

La differenza è che in Java stiamo controllando per una logica condizionale e non di aggregazione come SQL sta facendo.

Java esegue cortocircuiti nel senso che se il primo operando controllato è true, non eseguirà gli altri operandi.

in SQL le dichiarazioni, ove è alla ricerca di tutte le condizioni e le ab condizioni indipendentemente dal momento che si sta utilizzando or

1
--As per my understanding, It should return data only based on a. 

La vostra comprensione è corretta. La query è ottimizzata internamente e non si sa per cosa si sta verificando. Ma controllerà entrambe le condizioni, e poi l'altro se necessario affinché sia ​​vero.

1

SQL non esegue il cortocircuito delle espressioni logiche. Quando chiedi i record WHERE A = 10 OR B = 10 chiedi entrambi - non stai chiedendo quelli in cui il primo caso è stato soddisfatto.

Se si vogliono emulare quel corto circuito di selezione logica, è possibile utilizzare questo invece:

Select * 
From Table 
Where A = 10 
Or 
(
    A <> 10 
And B = 10 
) 
+0

SQL * fa * espressioni logiche di cortocircuito.L'OP è solo confuso su come funziona l'elaborazione basata su set, tutto qui. –

Problemi correlati