2011-01-27 12 views
11

Estoy tratando de calcular un campo y quiero que se comporte de manera diferente dependiendo de si alguna de las columnas es nula. Estoy usando MySQLCaso NOT NULL condicional SQL

CASE 
    WHEN reply.replies <> NULL THEN 
    24/((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(qcr.LAST_MOD_TIME)+3600)/3600)*(ces.EXPERT_SCORE+2.5*scs.SIMILARITY)*(EXP(-reply.replies)) 
    ELSE 1 
END as ANSWER_SCORE 

¿Es esta la sintaxis correcta?

Respuesta

20

Es necesario tener when reply.replies IS NOT NULL

NULL es un caso especial en SQL y no puede compararse con = o> < operadores. IS NULL y IS NOT NULL se usan en su lugar.

+2

Claro que se puede comparar el uso de '=', '' <' and '<>. El resultado de la comparación es 'NULL'. Acepte que la lógica booleana de tres valores no es para todos, pero no puede decir "no se puede comparar". –

+0

mientras esto muestra cómo usar CASE, el código en cuestión ni siquiera necesita una funda – RichardTheKiwi

4
case when reply.replies IS NOT NULL ... 

No se puede comparar NULL con los operadores de comparación regulares (aritmética). Cualquier comparación aritmética con NULL devolverá NULL, incluso NULL = NULL o NULL <> NULL arrojarán NULL.

Use IS o IS NOT en su lugar.

1

No necesita una declaración de caso para esto.
Usa el IFNULL function

IFNULL(24/((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(qcr.LAST_MOD_TIME)+3600)/3600) 
*(ces.EXPERT_SCORE+2.5*scs.SIMILARITY)*(EXP(-reply.replies)), 1) as ANSWER_SCORE 

Si reply.replies es nulo, la expresión es de acceso directo a NULL
IFNULL entonces toma el segundo parámetro (1) y da como resultado que cuando sucede.

Para otros casos donde necesita comparar a NULL, this will help you para trabajar con MySQL.

0

Usted puede hacer una declaración caso de control nulo

SELECT MAX(id+1), 
IF(MAX(id+1) IS NULL, 1, MAX(id+1)) 
AS id 
FROM `table_name`;