2011-02-18 17 views
7

¿Hay forma de probar tanto 0 como NULL con un operador de igualdad?sql booleano truth test: cero O nulo

que se dan cuenta de que podía hacer esto:

WHERE field = 0 OR field IS NULL

Pero mi vida sería cien veces más fácil si esto funcionaría:

WHERE field IN (0, NULL)

(por cierto, ¿por qué no lo hace ese trabajo?)

También he leído acerca de la conversión de NULL a 0 en la declaración SELECT (con COALESCE). El marco que estoy usando también lo haría desagradable.

Darse cuenta de esto es extrañamente específico, pero ¿hay alguna forma de probar 0 y NULL con un predicado WHERE?

+0

Respondiendo al "¿por qué no que el trabajo" parte: 'donde el campo EN (0, NULL)' 'es donde el campo = 0 o campo = null' el último caso es' unknown' –

+1

Si expanda su cláusula IN, debería ser más claro por qué no funciona: 'field IN (0, NULL)' es equivalente a 'field = 0 OR field = NULL' y no puede usar el operador" = "para probar para NULL, el resultado es desconocido. –

+0

tenga en cuenta que si quiere el inverso de eso, el campo <> 0 funciona. Pero no se puede negar, ya que cualquier operación en un resultado nulo sigue siendo nula. –

Respuesta

6

No funciona porque field In(0,Null) es el equivalente a field = 0 Or field = Null en comparación con field = 0 Or field Is Null. Una opción es utilizar una expresión de caso:

Case 
When field = 0 Then 1 
When field Is Null Then 1 
End = 1 

La mejor opción es seguir con el original field = 0 OR field Is Null ya que hace que su intención más clara.

+0

+1 También es sargable. –

0

Su declaración WHERE es mejor IMO, Sin embargo, puede intentar WHERE !IFNULL(field, 0)?

8

que iba a escribir que la comparación utilizando la mano IFNULL función:

IFNULL(field, 0) = 0 

Y en respuesta a una pregunta sobre la función en:

"Para cumplir con el estándar SQL, EN retornos NULL no solo si la expresión en el lado izquierdo es NULL, sino también si no se encuentra coincidencia en la lista y una de las expresiones en el l ist es NULL ". - the docs

Cuestiones relacionadas