MySQL: obtenir un MAX ou PLUS de plusieurs colonnes, mais avec des champs NULL
Je suis en train de sélectionner le max date dans trois différents champs de chaque enregistrement (MySQL)
Ainsi, dans chaque ligne, j'ai date1, date2 et date3: date1 est toujours rempli, date2 et date3 peut être NULL ou vide
La PLUS grande déclaration est simple et concis, mais n'a aucun effet sur les champs NULL, donc cela ne fonctionne pas bien:
SELECT id, GREATEST(date1, date2, date3) as datemax FROM mytable
J'ai essayé aussi des solutions plus complexes comme ceci:
SELECT
CASE
WHEN date1 >= date2 AND date1 >= date3 THEN date1
WHEN date2 >= date1 AND date2 >= date3 THEN date2
WHEN date3 >= date1 AND date3 >= date2 THEN date3
ELSE date1
END AS MostRecentDate
Même problème ici: les valeurs NULL sont un GRAND problème dans le retour de la droite enregistrements
S'il vous plaît, avez-vous une solution?
Merci d'avance....
Vous devez vous connecter pour publier un commentaire.
Utilisation
COALESCE
Mise à jour: Cette réponse précédemment utilisé
IFNULL
qui fonctionne, mais comme Mike Chamberlain a souligné dans les commentaires,COALESCE
est en fait la méthode préférée.Si
date1
ne peut jamais êtreNULL
, alors le résultat ne doit jamais êtreNULL
, droit? Ensuite, vous pouvez utiliser, si vous voulezNULL
dates seront pas pris en compte dans les calculs (ou de modifier le1000-01-01
à9999-12-31
, si vous voulez les valeurs Null à la "fin des temps"):COALESCE
votre date de colonnes avant de les utiliser dansGREATEST
.La façon dont vous les manipulez dépendra de la façon dont vous voulez traiter avec
NULL
.. soit haute ou basse?buuut, si toutes les dates se trouvent être nulle? vous voulez toujours avoir la valeur null comme une sortie, à droite? ensuite, vous avez besoin de ce
Maintenant, si les deux sont nuls, vous obtenez la valeur null si l'un d'entre eux n'est pas nul de deux d'entre eux ne sont pas nuls, vous obtenez le maximum de.
C'est fou, surtout si vous allez l'utiliser à plusieurs reprises, pour cela, alors vous voudrez peut-être créer comme une fonction, comme ceci:
Alors vous pouvez l'utiliser comme ceci