2011-09-09 34 views
6

ANSI-92 SQL mandatos que las comparaciones con NULL evalúan a "Falsy", por ejemplo:Las comparaciones con valores NULL en SQL

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

Will tanto no devuelven filas porque NULL no se puede comparar el estilo. En cambio, los predicados IS NULL y IS NOT NULL tienen que ser utilizados en su lugar:

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

investigación me ha demostrado que Oracle , PostgreSQL, MySQL y SQLite todos a favor de la sintaxis ANSI. Agregue a esa lista DB2 y Firebird.

Aparte de SQL Server con ANSI_NULLS apagado, ¿qué otro RDBMS admite la sintaxis no ANSI?

Toda la secuencia vacía = NULL a pesar del desastre.

+0

Oracle (11g aquí) hace exactamente lo que describes en ambos casos. –

Respuesta

3

Here es una buena comparación de manejo nulo en SQLite, PostgreSQL, Oracle, Informix, DB2, MS-SQL, el ocelote, MySQL 3.23.41, MySQL 4.0.16, Firebird, SQL Anywhere y Borland Interbase

14

Por lo que vale la pena, comparar algo con NULL no es estrictamente falso, es desconocido. Además, se desconoce el NOT desconocido.

ANSI SQL-99 define un predicado IS [NOT] DISTINCT FROM. Esto le permite mezclar valores nulos y no nulos en comarisons, y siempre obtener un verdadero o falso. Nulo en comparación con nulo de esta manera es cierto, de lo contrario cualquier no nulo en comparación con nulo es falso. Así que la negación funciona como probablemente esperas.

PostgreSQL, IBM DB2 y Firebird son compatibles con IS [NOT] DISTINCT FROM.

MySQL tiene un operador similar de comparación nula <=> que devuelve verdadero si los operandos son los mismos y falsos si son diferentes.

Oracle tiene la ruta más difícil. Tienes que ser creativo con el uso de NVL() o booleanas expresiones:

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

Yuck.

+0

Esta no era realmente mi pregunta, pero es bueno saberlo. +1 – NullUserException

+1

La escritura entre las líneas es que no hay una forma estándar de deshabilitar el comportamiento estándar. –

+0

@Daniel No estaba buscando una forma estándar en absoluto; sólo * any * way (como 'SET ANSI_NULLS OFF' de SQL Server) – NullUserException

Cuestiones relacionadas