2011-09-09 4 views
6

ANSI-92 mandati SQL che il confronto con NULL restituiscono "falsy," ad esempio:confronti con NULL in SQL

SELECT * FROM table WHERE field = NULL 
SELECT * FROM table WHERE field != NULL 

Will sia restituiscono alcuna riga perché NULL non può essere paragonata come quello. Invece, i predicati IS NULL e IS NOT NULL devono essere utilizzati al posto:

SELECT * FROM table WHERE field IS NULL 
SELECT * FROM table WHERE field IS NOT NULL 

ricerca mi ha dimostrato che Oracle , PostgreSQL, MySQL e SQLite tutte supportano la sintassi ANSI. Aggiungi a tale elenco DB2 e Firebird.

Oltre a SQL Server con ANSI_NULLS disattivato, quali altri RDBMS supportano la sintassi non ANSI?

Tutta la stringa vuota = NULL pasticcio nonostante.

+0

Oracle (11g qui) fa esattamente come descrivi in ​​entrambi i casi. –

risposta

3

Here è un bel confronto di movimentazione null a SQLite, PostgreSQL, Oracle, Informix, DB2, MS-SQL, OCELOT, MySQL 3.23.41, MySQL 4.0.16, Firebird, SQL Anywhere e Borland Interbase

14

Per quello che vale, il confronto di qualcosa con NULL non è rigorosamente falso, è sconosciuto. Inoltre, lo sconosciuto NOT è ancora sconosciuto.

ANSI SQL-99 definisce un predicato IS [NOT] DISTINCT FROM. Ciò ti consente di mischiare valori nulli e non nulli nelle confusioni e ottenere sempre un valore vero o falso. Null rispetto a null in questo modo è true, altrimenti qualsiasi non null rispetto a null è falso. Quindi la negazione funziona come probabilmente ti aspetti.

PostgreSQL, IBM DB2 e Firebird supportano IS [NOT] DISTINCT FROM.

MySQL ha un operatore di confronto Null-safe simile <=> che restituisce true se gli operandi sono uguali e false se sono diversi.

Oracle ha il percorso più difficile. Bisogna essere creativi con utilizzo di NVL() o booleani espressioni:

WHERE a = b OR (a IS NULL AND b IS NULL) 

Yuck.

+0

Questa non era la mia domanda, ma buono a sapersi. +1 – NullUserException

+1

La scrittura tra le righe è che non esiste un modo standard per disabilitare il comportamento standard. –

+0

@Daniel Non stavo affatto cercando un modo standard; solo * qualsiasi * modo (come 'SET ANSI_NULLS OFF di SQL Server') – NullUserException