variable valores valor validar una significado saber reemplazar que ejemplos consulta cocina celulares campo buscar sql database null nullable

sql - valores - por qué nulo no es igual a nulo falso



saber si una variable es null en sql server (7)

Estaba leyendo este artículo: Obtener nulo == nulo en SQL

Y el consenso es que cuando intentamos probar la igualdad entre dos columnas sql (nulables), el enfoque correcto es:

where ((A=B) OR (A IS NULL AND B IS NULL))

Cuando A y B son NULL, (A = B) aún devuelve FALSE, ya que NULL no es igual a NULL. Es por eso que se requiere un cheque adicional.

¿Qué pasa cuando se prueban las desigualdades? Después de la discusión anterior, me hizo pensar que para probar la desigualdad tendría que hacer algo como:

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

Sin embargo, noté que eso no es necesario (al menos no en informix 11.5), y puedo hacer lo siguiente:

where (A<>B)

Si A y B son NULL, esto devuelve FALSE. Si NULL no es igual a NULL, entonces, ¿no debería ser TRUE?

EDITAR
Todas estas son buenas respuestas, pero creo que mi pregunta fue un poco vaga. Permítame reformular:

Dado que A o B pueden ser NULL, ¿es suficiente para verificar su desigualdad con

where (A<>B)

¿O necesito comprobarlo explícitamente así?

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

CONSULTE este thread para la respuesta a esta pregunta.


"Se desconoce que es igual a desconocido b? No hay forma de saberlo, entonces: desconocido".

La pregunta era: ¿por qué la comparación arroja FALSO?

Dada la lógica de tres valores, sería lógico que la comparación arrojara DESCONOCIDO (no FALSO). Pero SQL produce FALSE, y no DESCONOCIDO.

Una de las miríadas de perversidades en el lenguaje SQL.

Además, se debe tener en cuenta lo siguiente:

Si "desconocido" es un valor lógico en lógica ternaria, entonces debería ser el caso que una comparación de igualdad entre dos valores lógicos que resulten ser (el valor de) "desconocido", entonces esa comparación debería arrojar VERDADERO.

Si el valor lógico es en sí mismo desconocido, entonces obviamente no se puede representar poniendo el valor "desconocido" allí, porque eso implicaría que se conoce el valor lógico (que es "desconocido"). Es decir, ao, cómo la teoría relacional prueba que la implementación de la lógica de 3 valores plantea el requisito de una lógica de 4 valores, que una lógica de 4 valores conduce a la necesidad de una lógica de 5 valores, etc., etc. hasta el infinito.


Aquí hay una solución rápida

ISNULL (A, 0) = ISNULL (B, 0)

0 puede cambiarse a algo que nunca puede suceder en sus datos


El comportamiento predeterminado (ANSI) de nulos dentro de una expresión dará como resultado un nulo (hay suficientes otras respuestas con los casos de eso).

Sin embargo, hay algunos casos extremos y advertencias que colocaría cuando se trata de MS Sql Server que no se enumeran.

  • Los valores nulos dentro de una declaración que agrupa valores juntos se considerarán iguales y se agruparán.
  • Los valores nulos dentro de una declaración que los está ordenando se considerarán iguales.
  • Los valores nulos seleccionados dentro de una declaración que usa distinct se considerarán iguales al evaluar el aspecto distinto de la consulta

Es posible que SQL Server anule la lógica de expresión con respecto a la prueba Null = Null específica, utilizando SET ANSI_NULLS OFF, que le dará la igualdad entre los valores nulos: este no es un movimiento recomendado, pero sí existe.

SET ANSI_NULLS OFF select result = case when null=null then ''eq'' else ''ne'' end SET ANSI_NULLS ON select result = case when null=null then ''eq'' else ''ne'' end


La respuesta corta es ... NULLs son extraños , realmente no se comportan como cabría esperar.

Aquí hay un documento excelente sobre cómo funcionan los NULL en SQL. Creo que ayudará a mejorar su comprensión del tema. Creo que las secciones sobre el manejo de valores nulos en expresiones serán especialmente útiles para usted.

http://www.oracle.com/technology/oramag/oracle/05-jul/o45sql.html


Porque ese comportamiento sigue una lógica ternaria establecida donde NULL se considera un valor desconocido.

Si piensas en NULL como desconocido, se vuelve mucho más intuitivo:

Se unknown a igual a unknown b ? No hay forma de saberlo, entonces: unknown .


Todas las comparaciones que implican null no están definidas y se evalúan como falsas. Esta idea, que es lo que impide que el null se evalúe como equivalente a null , también evita que el null se evalúe como NO equivalente a null .


expresiones relacionales que implican NULL en realidad producen NULL de nuevo

editar

aquí, <> significa operador binario arbitrario, NULL es el marcador de posición SQL, y el value es cualquier valor ( NULL no es un valor):

  • NULL <> value -> NULL
  • NULL <> NULL -> NULL

la lógica es: NULL significa "sin valor" o "valor desconocido", por lo que cualquier comparación con cualquier valor real no tiene sentido.

es X = 42 verdadero, falso o desconocido, dado que usted no sabe qué valor (si lo hay ) X tiene? SQL dice que es desconocido. ¿ X = Y verdadero, falso o desconocido, dado que ambos son desconocidos? SQL dice que el resultado es desconocido . y lo dice para cualquier operación relacional binaria, que solo es lógica (incluso si tener NULLs en el modelo no está en primer lugar).

SQL también proporciona dos operadores de un solo sufijo, IS NULL e IS NOT NULL , estos devuelven TRUE o FALSE de acuerdo con su operando.

  • NULL IS NULL -> TRUE
  • NULL IS NOT NULL -> FALSE