2011-04-20 18 views
5

Entiendo que el estándar SQL permite múltiples valores NULL en una columna que es parte de la restricción UNIQUE.En PostgreSQL (y tal vez en otros motores), ¿por qué la instrucción UNION considera que los valores NULOS son los mismos, mientras que la restricción ÚNICA no?

Lo que no entiendo es por qué el constructo UNION (al menos en PostgreSQL) trata los valores NULOS como iguales. Por ejemplo:

$ select * from tmp_a; 
a | b 
---+--- 
a | b 
a | 
    | 
(3 rows) 

$ select * from tmp_b; 
a | b 
---+--- 
a | c 
a | 
    | 
(3 rows) 

$ select a, b from tmp_a union select a, b from tmp_b order by 1, 2; 
a | b 
---+--- 
a | b 
a | c 
a | 
    | 
(4 rows) 

Respuesta

1

la regla general en el estándar SQL-92 es el siguiente:

13.1 'declare cursor' (recuerda ORDER BY es parte de un cursor) la regla general 3b:

el siguiente tratamiento especial de valores nulos. Ya sea una especie valor clave que es nulo se considera en mayor o inferior a un valor no nulo es definido por la implementación, pero todo Ordenar valores clave que son nulos serán bien considerarse mayor que todos los valores no nulos o se considerará menos que todos los valores no nulos.

El SQL-89 indicó la misma un poco más claramente la OMI:

Aunque x = y se desconoce si ambos x y y son NULL valores, en el contexto de GROUP BY, ORDER BY y DISTINCT , un valor NULL es idéntico o es un duplicado de otro valor NULL.

yo supongo que PostgreSQL está llevando a cabo una especie de eliminar duplicados como es requerido por UNION y es agrupar los valores NULL une en línea con las Normas.

2

No he podido encontrar una fuente más primaria, pero de acuerdo con this Wikipedia article, hay un caso especial para los nulos cuando se trata de operaciones de agrupación. Para esas operaciones, como DISTINCT y UNION, NULL no es "distinto" de NULL, aunque los dos NULL también son "no iguales".

1

Hay un interesante web page sobre esto en el sitio SQLite con una encuesta de diferencias entre las implementaciones de SQL.

1

El tratamiento de nulos en SQL es fundamentalmente inconsistente y a veces contradictorio. No existe una base lógica sólida detrás del comportamiento de los nulos en SQL. Solo tiene que aprender las diferentes reglas que se aplican en diferentes lugares y aplicarlas o solucionarlas.

Cuestiones relacionadas