2016-01-07 14 views
5

Una clausola WHERE può restituire NULL anziché TRUE o FALSE? Secondo l'esercizio seguente è possibile, ma non riesco a immaginare un esempio che restituisce NULL, è davvero possibile?Un predicato della clausola WHERE può essere valutato su NULL?

4. Which of the following values can NOT be returned after evaluation of WHERE clause 
condition? 
A. UNKNOWN 
B. TRUE 
C. FALSE 
D. NULL 
Answer: A. If the result of the condition in WHERE clause is not known, NULL is returned. In all 
other scenarios, either TRUE or FALSE is returned. 
+7

La risposta corretta è D. Vedi qui: https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm –

+1

Quindi un 'NULL == NULL 'restituire 'UNKNOWN'. Destra? –

+0

@SuhasK Secondo il loro documento, sì. –

risposta

2

In SQL, tutti gli operatori logici valutano TRUE, FALSE e SCONOSCIUTO (Oracle docs) in RISULTATO SCONOSCIUTO MySQL chiama NULL (MySQL docs).

Secondo la documentazione di Oracle:

"per verificare i valori nulli, utilizzare solo le condizioni di confronto è nullo ed è NOT NULL Se si utilizza qualsiasi altra condizione con valori null e il risultato dipende dal valore. del nulla, quindi il risultato è SCONOSCIUTO. "

Quindi solo VERO, FALSO e SCONOSCIUTO possono essere restituiti dopo la valutazione.

Circa la tua domanda:

"? Può una WHERE ritorno clausola di NULL al posto di VERO o FALSO"

A rigor di termini in Oracle - NO perché il risultato del genere chiamato UNKNOWN.

Ma in generale il significato di UNKNOWN e NULL è equivalente in questo contesto ed è solo un nome diverso per la stessa cosa. Quindi l'esempio di SQL di seguito (a.a >= all) valutato come UNKNOWN.

with table_a as (
select null as a from dual 
union all 
select 10 as a from dual 
union all 
select 5 as a from dual), 
table_b as (
select null as a from dual 
union all 
select 10 as a from dual 
union all 
select 5 as a from dual) 

select * from table_a a where a.a >= all(select a from table_b b) 
+1

In SQL standard, 'UNKNOWN' e' NULL' sono concetti * distinti *. È solo mysql (per quanto ne so) che confonde i due. –

+0

@Damien_The_Unbeliever grazie, ho corretto, la mia risposta. –

0

Come spiegare la ragione, ritengono che il linguaggio SQL utilizza una logica a tre valori: TRUE, FALSE e NULL. Consideriamo questa tabella Ordini,

enter image description here

Se corriamo il seguente interrogazione è solito restituire le righe per la CPU e monitor

SELECT * FROM Orders WHERE (qty < 1000 Or qty >= 1000) 

In questo caso, per la CPU e monitorare le condizioni (qty < 1000 Or qty >= 1000) rendimenti né TRUEFALSE. Restituisce NULL. Perché logicamente è sconosciuto. Pertanto, il risultato della condizione nella clausola WHERE è sconosciuto e ha restituito NULL.

È possibile considerare questo reference.

+0

SQL standard descrive una logica a tre valori in cui i valori possibili sono "VERO", "FALSO" e "SCONOSCIUTO". È solo mysql, per quanto ne so, confonde/confonde 'UNKNOWN' e' NULL'. –

+0

@Damien_The_Unbeliever No, anche MS SQL fa la stessa cosa. E poiché si suppone che 'UNKNOWN' e' NULL' si comportino esattamente nello stesso modo, non vedo davvero perché tu voglia due parole chiave per la stessa cosa. In ogni caso, hai ragione che ANSI SQL ha sia 'UNKNOWN' che' NULL', per qualsiasi motivo. – Luaan

+0

@Luaan - non secondo [la loro documentazione] (https://msdn.microsoft.com/en-GB/library/ms188074.aspx): "Il risultato di un operatore di confronto ha il tipo di dati Boolean. Questo ha tre valori : TRUE, FALSE e UNKNOWN " –

0

Nemmeno un NULL può essere uguale a NULL.

  1. Il modo corretto per capire nulla è che non è un valore. Not "questo è un valore NULL" ma "questo NULL non è un valore". Tutto è un valore o non lo è.
  2. Quando qualcosa è un valore, è "1" o "ciao" o "verde" o "$ 5.00 "ecc. - ma quando qualcosa non è un valore, non è semplicemente lo nulla.
  3. SQL rappresenta "questo non ha valore" per lo speciale non valore NULL. Quando qualcuno dice "il valore NULL", uno dovrebbe mentalmente non essere d'accordo, perché non c'è niente del genere. NULL è l'assenza totale, completa di qualsiasi valore. sottolineato testo

Un aspetto non tecnica

Se chiedete a due ragazze, quanti anni hanno? potresti sentirli a rifiutarsi di rispondere alla tua domanda, Entrambe le ragazze ti danno NULL come età e questo non significa che entrambe abbiano un'età simile. Quindi non c'è nulla può essere uguale a null.

SELECT 0 IS NULL , 0 IS NOT NULL , '' IS NULL , '' IS NOT NULL, NULL != NULL, NULL = NULL, NULL != '', NULL = ''