2 votes

Comment utiliser une variable définie par l'utilisateur à l'intérieur d'une expression `IF` ?

Certaines de mes instructions SQL ressemblent à ceci :

  IF(timediff(a.wo_finish_time,
               IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                  a.wo_failure_time,
                  a.wo_creation_time)) < 0,
      0,
      timediff(a.wo_finish_time,
               IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                  a.wo_failure_time,
                  a.wo_creation_time)))

Comme vous pouvez le constater, il est verbeux car une partie apparaît deux fois. J'ai donc essayé d'utiliser une variable définie par l'utilisateur comme ceci :

 if(@down_time := timediff(a.wo_finish_time,
                             IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                                a.wo_failure_time,
                                a.wo_creation_time)) < 0,
      0,
      @down_time)

Peut-être qu'en raison de la différence de portée des variables, cela ne fonctionne pas. Je sais que je peux mettre cette déclaration de variable @down_time dans SELECT mais cela l'ajouterait également à la colonne de sortie. Je suppose qu'il doit y avoir une meilleure façon de procéder, c'est pourquoi je pose cette question, en espérant trouver une meilleure approche.

1voto

Tim Biegeleisen Points 53335

Vous pouvez utiliser ce qui suit GREATEST truc :

SELECT GREATEST(0, TIMEDIFF(a.wo_finish_time,
                       IF(a.wo_failure_time <> '0000-00-00 00:00:00',
                       a.wo_failure_time,
                       a.wo_creation_time)))
FROM yourTable

Une autre solution ne nécessitant pas de SQL dynamique consisterait à envelopper votre requête actuelle et à en extraire la valeur correcte par le biais d'une sous-requête, quelque chose comme ceci :

SELECT
    CASE WHEN t.col < 0 THEN 0 ELSE t.col END AS col
FROM
(
    SELECT TIMEDIFF(a.wo_finish_time,
           IF(a.wo_failure_time <> '0000-00-00 00:00:00',
              a.wo_failure_time,
              a.wo_creation_time)) AS col
           -- other columns?
    FROM yourTable
) t

Si vous utilisiez déjà une telle sous-requête ou si les performances n'étaient pas critiques, cette deuxième option pourrait s'avérer judicieuse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X