in

¿Por qué NULL = NULL se evalúa como falso en el servidor SQL?

apple touch icon@2

Aquí espero aclarar mi posición.

Ese NULL = NULL evaluar a FALSE Está Mal. Hacker y Mister respondieron correctamente NULL. He aquí por qué. Dewayne Christensen me escribió, en un comentario a Scott Ivey:

Como es diciembre, usemos un ejemplo estacional. Tengo dos regalos debajo del árbol. Ahora, dime si tengo dos iguales o no.

Pueden ser diferentes o pueden ser iguales, tu no sabes hasta que uno abra ambos regalos. ¿Quién sabe? Invitaste a dos personas que no se conocen y ambas te han hecho el mismo regalo: raro, pero no imposible §.

Entonces la pregunta: ¿estos dos regalos DESCONOCIDOS son iguales (iguales, =)? La respuesta correcta es: DESCONOCIDO (es decir NULL).

Este ejemplo estaba destinado a demostrar ese «..(false o null, dependiendo de su sistema) .. «es una respuesta correcta, no lo es, solamente NULL es correcto en 3VL (¿o está bien que acepte un sistema que da respuestas incorrectas?)

Una respuesta correcta a esta pregunta. Debe enfatizar estos dos puntos:

  • la lógica de tres valores (3VL) es contraria a la intuición (vea innumerables otras preguntas sobre este tema en Stackoverflow y en otros foros para asegurarse);
  • Los DBMS basados ​​en SQL a menudo no respetan ni siquiera 3VL, a veces dan respuestas incorrectas (como afirma el cartel original, SQL Server en este caso).

Entonces reitero: SQL no sirve de nada forzar a uno a interpretar la propiedad reflexiva de la igualdad, que establece que:

for any x, x = x §§ (en un lenguaje sencillo: cualquiera que sea el universo del discurso, una «cosa» siempre es igual a sí misma).

.. en un 3VL (TRUE, FALSE, NULL). La expectativa de las personas se ajustaría a 2VL (TRUE, FALSE, que incluso en SQL es válido para todos los demás valores), es decir x = x siempre evalúe a TRUE, para cualquier valor posible de x – sin excepciones.

Tenga en cuenta también que los valores NULL son válidos » no valores «(como pretenden ser sus apologistas) que se pueden asignar como valores de atributo (??) como parte de las variables de relación. Entonces son valores aceptables de todo tipo (dominio), no solo del tipo de expresiones lógicas.

Y este era mi punto: NULL, como valor, es una «extraña bestia». Sin eufemismo, prefiero decir: disparates.

Creo que esta formulación es mucho más clara y menos discutible, perdón por mi escaso dominio del inglés.

Esto es sólo uno de los problemas de NULL. Es mejor evitarlos por completo, cuando sea posible.

§ estamos preocupados por valores aquí, por lo que el hecho de que los dos regalos sean siempre dos objetos físicos diferentes no son una objeción válida; Si no está convencido, lo siento, no es este el lugar para explicar la diferencia entre la semántica de valor y «objeto» (el álgebra relacional tiene semántica de valor desde el principio; consulte el principio de información de Codd; creo que algunos implementadores de DBMS SQL no ni siquiera se preocupan por una semántica común).

§§ que yo sepa, este es un axioma aceptado (de una forma u otra, pero siempre interpretado en un 2VL) desde la antigüedad y que exactamente porque es tan intuitivo. 3VL (es una familia de lógicas en realidad) es un desarrollo mucho más reciente (pero no estoy seguro de cuándo se desarrolló por primera vez).

Nota al margen: si alguien presentara Fondo, Unidad y Opción Tipos como intentos de justificar los NULL de SQL, me convenceré solo después de un examen bastante detallado que mostrará cómo las implementaciones de SQL con NULL tienen un sistema de tipos sólido y aclarará, finalmente, qué NULL (estos «valores-no-exactamente-valores «) realmente son.


A continuación, citaré a algunos autores. Cualquier error u omisión probablemente sea mío y no de los autores originales.

Joe Celko sobre SQL NULL

Veo a Joe Celko citado a menudo en este foro. Aparentemente, es un autor muy respetado aquí. Entonces, me dije a mí mismo: «¿Qué escribió sobre SQL NULL? ¿Cómo explica los numerosos problemas de NULL?». Uno de mis amigos tiene una versión de libro electrónico de SQL de Joe Celko para smarties: programación SQL avanzada, tercera edición. Vamos a ver.

Primero, la tabla de contenido. Lo que más me llama la atención es la cantidad de veces que se menciona NULL y en los contextos más variados:

3.4 Aritmética y NULL 109
3.5 Conversión de valores hacia y desde NULL 110
3.5.1 Función NULLIF () 110
6 NULL: datos faltantes en SQL 185
6.4 Comparación de valores NULL 190
6.5 NULL y lógica 190
6.5.1 NULLS en predicados de subconsultas 191
6.5.2 Soluciones SQL estándar 193
6.6 Matemáticas y NULL 193
6.7 Funciones y NULL 193
6.8 NULL e idiomas de host 194
6.9 Consejos de diseño para NULL 195
6.9.1 Evitar NULL de los programas de host 197
6.10 Una nota sobre múltiples valores NULL 198
10.1 Predicado 241 IS NULL
10.1.1 Fuentes de NULL 242

etcétera. Me suena a «caso especial desagradable».

Entraré en algunos de estos casos con extractos de este libro, tratando de limitarme a lo esencial, por razones de derechos de autor. Creo que estas citas caen dentro de la doctrina del «uso justo» e incluso pueden estimular a comprar el libro, así que espero que nadie se queje (de lo contrario, tendré que eliminar la mayor parte, si no todo). Además, me abstendré de informar fragmentos de código por el mismo motivo. Lo siento por eso. Compre el libro para leer sobre el razonamiento basado en datos.

Números de página entre paréntesis en lo que sigue.

Restricción NOT NULL (11)

La restricción de columna más importante es NOT NULL, que prohíbe el uso de NULL en una columna. Utilice esta restricción de forma rutinaria y elimínela solo cuando tenga una buena razón. Te ayudará a evitar las complicaciones de Valores NULL cuando realiza consultas contra los datos.

No es un valor; es un marcador que tiene un lugar donde podría ir un valor.

De nuevo, esta tontería de «valor pero no del todo valor». El resto me parece bastante sensato.

(12)

En resumen, los NULL causan muchas características irregulares en SQL, que discutiremos más adelante. Lo mejor que puede hacer es memorizar las situaciones y las reglas de los NULL cuando no puede evitarlas.

A propósito de SQL, NULL e infinito:

(104) CAPÍTULO 3: DATOS NUMÉRICOS EN SQL

SQL no ha aceptado el modelo IEEE para matemáticas por varias razones.

Si las reglas IEEE para matemáticas estuvieran permitidas en SQL, entonces necesitaríamos reglas de conversión de tipos para infinito y una forma de representar un valor numérico exacto infinito después de la conversión. La gente tiene suficientes problemas con los NULL, así que no vayamos allí.

Implementaciones SQL indecisas sobre lo que realmente significa NULL en contextos particulares:

3.6.2 Funciones exponenciales (116)

El problema es que los logaritmos no están definidos cuando (x <= 0). Algunas implementaciones de SQL devolver un mensaje de error, algunos devuelven un NULO y DB2 / 400; la versión 3, lanzamiento 1, devolvió * NEGINF (abreviatura de «infinito negativo») como resultado.

Joe Celko citando a David McGoveran y CJ Fecha:

6 NULL: datos faltantes en SQL (185)

En su libro Una guía para Sybase y SQL Server, David McGoveran y CJ Date dijeron: “Es la opinión de este escritor que los NULL, al menos tal como se definen e implementan actualmente en SQL, son mucho más problemáticos de lo que valen y deben evitarse; muestran un comportamiento muy extraño e inconsistente y pueden ser una rica fuente de error y confusión. (Tenga en cuenta que estos comentarios y críticas se aplican a cualquier sistema que admita NULL de estilo SQL, no solo a SQL Server específicamente) «.

NULL como drogadicción:

(186/187)

En el resto de este libro, Te estaré instando a que no los uses, que puede parecer contradictorio, pero no lo es. Piense en un NULL como una droga; Úselo correctamente y le funcionará, pero si lo abusa puede arruinarlo todo. Su mejor política es evitar los NULL cuando pueda y utilizarlos correctamente cuando sea necesario.

Mi única objeción aquí es «usarlos correctamente», lo que interactúa mal con comportamientos de implementación específicos.

6.5.1 NULLS en predicados de subconsultas (191/192)

La gente olvida que una subconsulta a menudo oculta una comparación con un NULL. Considere estas dos tablas:

El resultado estará vacío. Este es contradictorio, pero correcto.

(separador)

6.5.2 Soluciones SQL estándar (193)

SQL-92 resolvió algunos de los problemas de 3VL (lógica de tres valores) agregando un nuevo predicado de la forma:

ES [NOT] VERDADERO | FALSO | DESCONOCIDO

Pero DESCONOCIDO es una fuente de problemas en sí mismo, por lo que CJ Date, en su libro citado a continuación, recomienda en el capítulo 4.5. Evitar nulos en SQL:

  • No use la palabra clave DESCONOCIDO en ningún contexto.

Leer «APARTE» en DESCONOCIDO, también vinculado a continuación.

6.8 NULL e idiomas de host (194)

Sin embargo, debe saber cómo se manejan los NULL cuando deben pasarse a un programa anfitrión. Ningún lenguaje host estándar para el que se define una incrustación admite NULL, que es otra buena razón para evitar su uso en el esquema de su base de datos.

(separador)

6.9 Consejos de diseño para NULL (195)

Es una buena idea declarar todas sus tablas base con restricciones NOT NULL en todas las columnas siempre que sea posible. Los NULL confunden a las personas que no conocen SQL y los NULL son costosos.

Objeción: NULL confunde incluso a las personas que conocen bien SQL, consulte a continuación.

(195)

Los NULL deben evitarse en FOREIGN KEY. SQL permite esta relación de «beneficio de la duda», pero puede causar una pérdida de información en consultas que involucran combinaciones. Por ejemplo, dado un código de número de pieza en el Inventario al que se hace referencia como CLAVE EXTRANJERA en una tabla de Órdenes, tendrá problemas para obtener una lista de las piezas que tienen un NULO. Esta es una relación obligatoria; no se puede pedir una pieza que no existe.

(separador)

6.9.1 Evitar NULL de los programas de host (197)

Puede evitar poner NULL en la base de datos desde los programas de host con alguna disciplina de programación.

  1. Determine el impacto de los datos faltantes en la programación y la presentación de informes:
    Las columnas numéricas con NULL son un problema, porque las consultas que utilizan funciones agregadas pueden proporcionar resultados engañosos.

(separador)

(227)

SUM () de un conjunto vacío es siempre NULL. Uno de los errores de programación más comunes que se cometen al usar este truco es escribir una consulta que podría devolver más de una fila. Si no lo pensó, podría haber escrito el último ejemplo como: …

(separador)

10.1.1 Fuentes de NULL (242)

Es importante recordar dónde pueden ocurrir NULL. Son más que un posible valor en una columna.. Las funciones agregadas en conjuntos vacíos, OUTER JOIN, expresiones aritméticas con NULL y operadores OLAP devuelven NULL. Estas construcciones a menudo se muestran como columnas en VIEWs.

(separador)

(301)

Otro problema con NULL se encuentra cuando intenta convertir predicados IN en predicados EXISTS.

(separador)

16.3 Las funciones de TODOS los predicados y los extremos (313)

Al principio, es contradictorio que estos dos predicados no sean iguales en SQL:

Pero debe recordar las reglas para las funciones extremas: eliminan todos los valores NULL antes de devolver los valores mayores o menores. El predicado ALL no elimina NULL, por lo que puede obtenerlos en los resultados.

(separador)

(315)

Sin embargo, la definición en el estándar está redactada en negativo, por lo que los NULL obtienen el beneficio de la duda. …

Como puede ver, es una buena idea evitar NULL en restricciones UNIQUE.

Discutiendo el GRUPO POR:

Los NULL se tratan como si fueran todos iguales entre síy formar su propio grupo. Luego, cada grupo se reduce a una sola fila en una nueva tabla de resultados que reemplaza a la anterior.

Esto significa que para GROUP BY cláusula NULL = NULL no se evalúa como NULL, como en 3VL, pero se evalúa como TRUE.

El estándar SQL es confuso:

ORDER BY y NULL (329)

Si un valor de clave de ordenación …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

lookup 1

Splunk – Búsquedas

17bd07639b20145ff3f3e6a40a28cc83 1200 80

Guía de Batman: Arkham Knight Riddler: cómo resolver todos los desafíos de Riddler