Siempre estoy desconcertado con respecto a algún comportamiento misterioso de t-sql, como el siguiente
-- Create table t and insert values.
use tempdb
CREATE TABLE dbo.t (a INT NULL);
-- insert 3 values
INSERT INTO dbo.t values (NULL),(0),(1);
GO
set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null
go
-- expect 3 rows returned but only 2 returned (without null value row)
select * from dbo.t where a = a
No se trata de cómo recuperar todas las filas de una tabla y tampoco se trata de evitar el uso de ANSI_NULLS.
Solo quiero solicitar algunas ideas de por qué t-sql se comporta así.
Robert Sheldon en la siguiente publicación de 2015 analiza los comportamientos NULL y por qué a veces (pero no siempre) fallan
https://www.simple-talk.com/sql/t-sql-programming/how-to-get-nulls-horribly-wrong-in-sql-server/
Describe 13 fallas NULL que un programador puede tropezar fácilmente.
Fracaso # 1: No saber lo que significa NULL
Explicación: NULL es un valor no existente, un valor inexistente. No es cero No es una cadena vacía. Un valor no puede ser igual a NULL. No hay dos valores NULL iguales .
Ese es el problema básico, pero asegúrese de leer sobre las otras fallas.
Sí, las versiones anteriores (anteriores a SQL Server 7, creo) se comportaron de manera diferente, más como lo que quieres.
Sin embargo, si busca el problema en Stack Overflow y Stack Exchange, encontrará muchos hilos largos que discuten los problemas.
fuente
WHERE NULL = NULL
rinde verdadero cuando el ajuste es de.Para agregar a la discusión, la definición de NULL del estándar SQL92 se puede interpretar de manera ambigua. Aquí hay un buen resumen del manejo e interpretación NULL de varios DBMS cortesía de sqlite.org.
DIVULGACIÓN : Recuerdo haber leído sobre la "ambigüedad" de SQL92 de una versión anterior (como hace 6-8 años) de la página sqlite.org vinculada anteriormente, pero esa página se ha actualizado desde entonces.
La respuesta anterior de RLF tiene una buena cita, pero si no estoy de acuerdo con Robert Sheldon es solo porque considero que "algo que no existe" (es decir, un NULL ) es filosófica y semánticamente equivalente en inglés a "algo más que no existe". ". Si tengo que entender la lógica de Sheldon, entonces uno podría declarar que la definición de NULL también es NULL. (Si no existe, ¿cómo podemos definirlo? Espeluznante, ¿eh?)
Veo una variación de la preparación de Russell Paradox ( y un dolor de cabeza). : - \
Pero nuevamente, esta es una discusión sobre la semántica del idioma inglés ( NO SQL) y el debate sobre filosofía pertenece aquí . :-)
fuente