2012-07-16 16 views
32

Esta es una pregunta de seguimiento a mi última pregunta sobre combinaciones de tablas en MySQLMYSQL Left Join ¿Cómo selecciono valores NULL?

Necesito poder seleccionar los valores NULL de la tabla unida izquierda.

Aquí es mi unirse a:

table1.id | table1.name | table2.id | table2.surname 
     1 |  John |   1 |   Doe 
     2 |  Michael |   2 |  Anderson 
     3 |  Anna |  NULL |   NULL 
     4 |   Sue |  NULL |   NULL 

me gustaría seleccionar dónde table2.surname = NULL, pero una consulta como esta no funciona

SELECT table1.*,table2.* 
FROM table1 
LEFT JOIN table2 
    ON table1.id=table2.id 
WHERE table2.surname=NULL 

que puedan entender un poco la lógica detrás de esto no se dándome cualquier resultado, pero debe haber una forma de obtener los resultados?

agradecería cualquier ayuda

Respuesta

39

Para comparar NULL valores que tiene que utilizar el predicado IS NULL, así:

SELECT table1.*, table2.* 
FROM table1 
LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL 
+0

No está directamente relacionado con la pregunta, pero tiene que usar una cláusula 'WHERE', no la cláusula' AND' en la unión, para recuperar valores significativos. Eso me estaba molestando. – HartleySan

4

tratar con:

SELECT table1.*,table2.* 
FROM table1 
    LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL 
12

Usted tiene que usar IS NULL en lugar de = NULL:

WHERE table2.surname IS NULL 

La razón por la cual no se puede simplemente hacer = NULL se debe a NULL es esencialmente un "desconocido" y no puede igual o no es igual a nada (ni siquiera en sí), por lo que intentar compararlo con algo como si supuestamente fuera una coincidencia exacta, simplemente devolvería NULL en lugar de un booleano esperado 0 o 1, y esa es exactamente la razón por la que su consulta arrojó un resultado vacío.

Hay una clara diferencia entre "se desconoce" y "es igual a desconocido". Seguramente puede probar si algo es desconocida o no es desconocida, pero no se puede probar si algo "es igual a" desconocido porque es desconocida desconocida, y no tendría sentido.

También, puesto que usted está utilizando MySQL, otra opción sería utilizar table2.surname <=> NULL, donde <=> es un operador específico de MySQL comparación NULL-Safe, pero trate de no usar eso y sólo se adhieren con la forma estándar SQL (IS NULL/IS NOT NULL)

1

De acuerdo con MySQL specification debe usar "IS NULL" en lugar de "= NULL". Dice que "(NULL = NULL) es igual a NULL". Pero NULL es igual a False mientras lo usaba como Boolean.