Estoy tratando de extraer todas las filas donde dos campos no coinciden. Entiendo que los nulos son esencialmente "incógnitas" y, por lo tanto, he tomado medidas para definir los nulos como ceros. Como a continuación.

Select ifnull(field1, 0), ifnull(field2, 0) 
from table
where field1 != field2

¿Alguien puede decirme por qué esto no funciona? Todavía no obtengo resultados a pesar de que siento que estoy definiendo nulos como "0" con ifnull (campo1, 0) correctamente.

1
Mike D Wakelyn 18 oct. 2017 a las 14:36

3 respuestas

La mejor respuesta

No funciona porque así es como funcionan los valores NULL en bases de datos relacionales. Casi todas las comparaciones devuelven NULL, que se trata como falso.

Además, lo que haces en SELECT no tiene impacto en WHERE. Los campos aún provienen de la tabla original.

Lo más importante es lo que puedes hacer. El método más simple es utilizar una NULL - comparación segura:

where not field1 <=> field2
2
Gordon Linoff 18 oct. 2017 a las 11:39

Debería mover IFNULL () hacia abajo a la cláusula WHERE como esta:

Select ifnull(field1,0) as 'Field1', ifnull(field2, 0) as 'Field2'
from table
where ifnull(field1,0) != ifnull(field2,0)
0
MadsBinger 18 oct. 2017 a las 11:57

Porque 0 se inserta después y no antes de seleccionar

Debería ser en su lugar:

Select * from 
((Select *,ifnull(field1, 0) new_field1, ifnull(field2, 0) new_field2
from table) As query)
WHERE new_field1 != new_field2;
0
mrateb 18 oct. 2017 a las 11:44