2008-09-16 13 views

Respuesta

15

Es así en SQL (como lenguaje lógico) porque nulo significa desconocido/indefinido.

Sin embargo, en los lenguajes de programación (como, por ejemplo, C++ o C#), un puntero/referencia nulo es un valor específico con un significado específico: nada.

Dos nacimientos son equivalentes, pero dos incógnitas no lo son. La confusión proviene del hecho de que el mismo nombre (nulo) se usa para ambos conceptos.

+0

** Hay ** algunos lenguajes de programación con nulo-propagación. Por ejemplo, VB.Net http://msmvps.com/blogs/bill/archive/2007/09/07/c-defies-logic.aspx – MarkJ

3

Oracle es de esta manera.

SELECT * FROM dual WHERE NULL=null; --no rows returned 
+2

En realidad, esa es una propiedad de SQL en general, no es específica de Oracle. – sleske

3

MySQL tiene un operador de igualdad nulo seguro, < =>, que devuelve verdadero si ambos lados son iguales o ambos lados son nulos. Ver MySQL Docs.

+0

+1 Interesante, pero probablemente debería haber sido un comentario sobre una respuesta SQL – Willbill

2

Puede hacer rubí funciona así:

class Null 
def self.==(other);false;end 
end 
n=Null 
print "Null equals nothing" if n!=Null 
+1

Pato golpeando es una trampa :) –

+0

@Hugh: Bueno, uno podría decir eso, pero * es * posible, lo que significa que la gente lo hará ... si eso es bueno o malo es otro asunto. – sleske

+0

En ruby, null se llama nil y NULL no se definiría como el código publicado. Sin embargo, es perfectamente posible hacer lo que está implícito aquí escribiendo: 'class NilClass; def == (o); falso; fin; end' – einarmagnus

4

En VB6 la expresión Null = Null producirá Null en lugar de True como era de esperar. Esto causará un error de tiempo de ejecución si intenta asignarlo a un booleano; sin embargo, si lo usa como como "If ... Then", actuará como False. Por otra parte Null <> Null se también producen Null, por lo que:

En VB6 se podría decir que no es ni Null igual a sí mismo (o cualquier otra cosa), ni desigual!

Se supone que debe probarlo utilizando la función IsNull().

VB6 también tiene otros valores especiales:

  • Nothing de referencias a objetos. Nothing = Nothing es un error de compilación. (Se supone que debe compararlo usando "is")
  • Missing para los parámetros opcionales que no se han proporcionado. No tiene representación literal, por lo que no puede escribir Missing = Missing. (la prueba es IsMissing(foo))
  • Empty para variables no inicializadas. Éste prueba igual a sí mismo aunque hay también una función IsEmpty().
  • ... quisiera saber si me he olvidado de uno

Recuerdo que estaba un poco disgustado con VB.

+1

VB.Net también tiene una propagación nula. La propagación nula es confusa, pero si vas a tener tipos que aceptan nulos, es discutible que el gato esté fuera de la bolsa, y deberías propagar nulos. http://msmvps.com/blogs/bill/archive/2007/09/07/c-defies-logic.aspx – MarkJ

2

En C#, se puede anular > tiene propiedades interesantes con respecto a los operadores lógicos, pero el operador de igualdad es el == verdadero).

Para conservar el comportamiento short-circuited de los operadores lógicos en cortocircuito, y para preservar la coherencia con los operadores lógicos no en cortocircuito, el booleano nullable tiene algunas propiedades interesantes. Por ejemplo: true || null == verdadero. falso & & null == falso, etc. Esto está en contradicción directa con otros lenguajes lógicos de tres valores como ANSI SQL.

+0

Hay otros comportamientos interesantes en C#. Para algunos valores de x y y, 'x == y' es verdadero, pero' x <= y' es falso. Lo cual parece bastante difícil de defender. http://msmvps.com/blogs/bill/archive/2007/09/07/c-defies-logic.aspx – MarkJ

0

En SQL que tendría que hacer algo como:

WHERE column is NULL 

en lugar de

WHERE column = NULL 
No