web-dev-qa-db-fra.com

Cas conditionnel NOT NULL SQL

J'essaie de calculer un champ et je veux qu'il se comporte différemment selon que l'une des colonnes se trouve être nulle. J'utilise MySQL

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

Est-ce la bonne syntaxe?

16
Spencer

Vous devez avoir when reply.replies IS NOT NULL

NULL est un cas particulier en SQL et ne peut pas être comparé aux opérateurs = ou <>. IS NULL et IS NOT NULL sont utilisés à la place.

28
Joe Stefanelli
case when reply.replies IS NOT NULL ...

Vous ne pouvez pas comparer NULL avec les opérateurs de comparaison réguliers (arithmétiques). Toute comparaison arithmétique avec NULL retournera NULL, même NULL = NULL ou NULL <> NULL donnera NULL.

Utilisez IS ou IS NOT au lieu.

5
Tomalak

Vous n'avez pas besoin d'une déclaration de cas pour cela.
Utilisez fonction IFNULL

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 est null, l'expression est raccourcie vers NULL
IFNULL prend alors le 2ème paramètre (1) et le donne comme résultat quand il se produit.

Pour les autres cas où vous devez comparer avec NULL, cela vous aidera pour travailler avec MySQL.

1
RichardTheKiwi

Vous pouvez faire une déclaration CASE en vérifiant Null

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