El problema es que NULL no se considera igual a nada, ni siquiera a sí mismo, pero lo extraño es que tampoco es igual a sí mismo.
Considere las siguientes declaraciones (que por cierto es ilegal en SQL Server T-SQL pero es válido en My-SQL, sin embargo, esto es lo que ANSI define para nulo, y se puede verificar incluso en SQL Server mediante el uso de declaraciones de casos, etc.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Por lo tanto, no hay una respuesta verdadera / falsa a la pregunta, sino que la respuesta también es nula.
Esto tiene muchas implicaciones, por ejemplo en
- Sentencias CASE, en las cuales cualquier valor nulo siempre usará la cláusula ELSE a menos que use explícitamente la condición WHEN IS NULL ( NO la
WHEN NULLcondición )
- Concatenación de cadenas, como
SELECT a + NULL -- Results in NULL
- En una cláusula WHERE IN o WHERE NOT IN, como si quisiera resultados correctos, asegúrese de que en la subconsulta correlacionada se filtren los valores nulos.
Se puede anular este comportamiento en SQL Server especificando SET ANSI_NULLS OFF , sin embargo, esto NO se recomienda y no debe hacerse, ya que puede causar muchos problemas, simplemente debido a la desviación del estándar.
(Como nota al margen, en My-SQL hay una opción para usar un operador especial <=>para la comparación nula).
En comparación, en los lenguajes de programación generales, nulo se trata como un valor regular y es igual a sí mismo, sin embargo, es el valor NAN que tampoco es igual a sí mismo, pero al menos devuelve 'falso' al compararlo consigo mismo (y cuando verifica que no sea igual, diferentes lenguajes de programación tienen implementaciones diferentes).
Sin embargo, tenga en cuenta que en los lenguajes básicos (es decir, VB, etc.) no hay una palabra clave 'nula' y en su lugar se usa la palabra clave 'Nada', que no se puede usar en comparación directa y en su lugar se debe usar 'IS' como en SQL, sin embargo, de hecho es igual a sí mismo (cuando se usan comparaciones indirectas).