lunes, 22 de diciembre de 2008

"is not null" o "<> Null" en Sql Server

Trabajando con NHinbernate. mapeando unas clases, guardaba unos datos y hacia esta consulta para ver si estaba bien:


select * from table where campo <> NULL;


pero no me arrojaba los datos que queria y luego darle y darle vueltas hice esta consulta.

select * from table where campo is not NULL;


y ahi me di cuenta que el mapeo de Hibernet, y los cambios que habia hecho estaban bien. perdi toda una mañana de trabajo por esto :(.


Asi no es lo mismo "is not null" o "<> Null", por lo menos en Sql Server

Entonces ahora cada vez que quiera preguntar si un capo no es Null, voy a preguntar por "IS NOT NULL".

En caso de que quiera saber si un campo es null "IS NULL".




--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

20 comentarios:

  1. podrias dejar mas explisita la diferencia , ya que según lo que yo entiendo


    select * from table where campo is not null serian todos los que no sean null

    y si hago un select * from table where campo <> null
    serian todos los que sean distintos de null



    buscando el sig de esto encontre lo siguiente

    "distinto, ta"
    1. adj. Que no es igual ni semejante:
    el cangrejo de río y el de mar son distintos.

    "http://www.wordreference.com/definicion/distinto"

    ResponderEliminar
  2. El problema no esta en usar o no usar '<>' para comparar contra un valor nulo, sino que esta en el hecho de comparar contra nulo. No se puede comparar contra nulo, sino que hay que preguntar si se es o no es nulo, lo cual es otra cosa diferente. Es por ello que la consulta correcta es la que pregunta por null, es decir: 'SELECT ... WHERE X IS NULL'.

    ResponderEliminar
  3. jejejej vale , ya con eso queda mas claro , por que es verdad en c# siempre preguntamos por (==null) o (!=null) pero nunca por (<> null) :D

    ResponderEliminar
  4. la raíz está en que los operadores de comparación (=, <>) no están "preparados" para recibir el valor NULL en sus parámetros, en vez de True o False devuelven Unknown.
    De echo ocurre lo mismo con las varialbes:

    DECLARE @foo INT
    SET @foo = NULL

    SELECT var
    FROM tmp
    WHERE NOT id = @foo

    tendría el mismo resultado inesperado.
    para hacer más limpia la comparación con nulos el SQL provee la función ISNULL(campo, valor) que devuelve "valor" si "campo" es nulo.
    un ejemplo muy burdo:

    SELECT *
    FROM table
    WHERE ISNULL(campo, "") = ""

    obviamente es mucho mas lento que "IS NOT NULL" sin embargo tiene sentido en el tratamiento con varialbes T-SQL y tablas que aceptan valores nulos.

    ResponderEliminar
  5. Para mayores enredos, el estándar SQL99 dice que Unknown y NULL son equivalentes.

    Y de hecho en PostgreSQL, no existe Unknown, solo NULL. Luego se tiene:

    select (1 = null) is null
    => true

    select (1 <> null) is null
    => true

    Y también:

    select (null = null) is null
    => true

    select (null <> null) is null
    => true

    select (null is null) is not null
    => true

    ResponderEliminar
  6. Muy buenas las explicaciones.
    Me he despejado de varias dudas.
    Muchas gracias.

    --> "Shane"

    ResponderEliminar
  7. Me acabas de ahorrar (aunque ya llevaba un poco de tiempo pensandolo) varias horas de frustracion...

    Gracias por el dato del "is not null" ...

    ResponderEliminar
  8. Es verdad es todo un rollo esto de las fechas, después de 1 hora de darle vueltas a una consulta con una campo fecha sin resultado, aleluya SAN GOOGLE y te encontré. Mil gracias. Definitivamente IS NOT NULL es muy diferente a <>NULL.
    Cordiales saludos

    ResponderEliminar
  9. Una pregunta, se puede utilizar el is not null con dos campos al mismo tiempo?

    Es decir: where campo,campo is not null?

    Hay alguna manera de hacer esto?

    Muchas gracias

    ResponderEliminar
  10. nunca lo he visto, no creo que se pueda. :(

    ResponderEliminar
  11. Estoy estudiando y habian unos triggers que no me salían, y no entendía donde estabael problema, pues resultó ser esto, gracias!
    Saludos

    ResponderEliminar
  12. Me sacaste de un apuro, ya que estoy realizando una pequeña aplicacion web en asp.net en c# utilizando sql server 2008, y si no hubiera sido por su aclaracion, creo que todavia estaria en lios.

    ResponderEliminar
  13. GRACIAS POR EL APORTE ME SIRVIO DE MUCHO, SIGUE ADELANTE...

    ResponderEliminar
  14. keylis, lo q podrias acr en lo q mencionas, es concatenar ambos, darle un alias i preguntar por el alias, x otro lado Huguito buen aporte justo taba cabezeando sobre el tema :) ;)

    ResponderEliminar
  15. excelente respuesta gerardocontijoch..era lo que buscaba!!

    ResponderEliminar
  16. es la leche me saco de un atoyadero
    llevo 2 dis con esto
    y por fin vi la luz

    ResponderEliminar
  17. Muchas gracias me ha servido de mucho. Saludos.

    ResponderEliminar