Bonjour.
Je cherche à rendre conditionnel la prise en compte d'un paramètre dans une requêtes MySQL.
En fonction du fait qu'une association existe sur une table, je dois tester plusieurs conditions dans le but de définir si oui ou non l'enregistrement sera dans mon résutats.

C'est OK sauf dans un cas de figure qui est le suivant.
La requête est importante donc je limite ici à la partie qui pose souci.

J'ai besoin de retourner l'enregistrement dans plusieurs cas :

  1. Si d.insurancecompanyid IS NULL => Dans ce cas je ne dois pas tester d'autres chose, je prend les données
  2. Si il n'est pas NULL mais que ça TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) <= 2400 est false => Dans ce cas je ne dois pas chercher plus loin et retourner les données

SINON

Je dois également m'assurer que la sous requête présente dans le code ci-dessous retourne au moins 1 enregistrement , mais uniquement dans le cas ou les conditions précédentes sont TRUE

Je ne sais pas si je suis clair :(

AND (
        IF(d.insurancecompanyid IS NOT NULL 
            AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) <= 2400 
            AND (
                SELECT COUNT(insuranceagreements.insurancecompanyid)
                FROM insuranceagreements
                WHERE insuranceagreements.insurancecompanyid = d.insurancecompanyid
                    AND insuranceagreements.customerid = a.customerid
            ) > 0, 'true', 'false') 
    ) = 'true'

D'avance merci pour votre aide

Aucune réponse


Renand
Auteur

Bonjour,
Au final la meilleure approche à été d'utiliser la fonction CASE() ce qui permet à la fois d'être opérationnel et plus lisible.

AND CASE 
                            WHEN d.insurancecompanyid IS NULL THEN 1
                            WHEN d.insurancecompanyid IS NOT NULL 
                                AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) > i.insuranceexclusiveduration THEN 1
                            WHEN d.insurancecompanyid IS NOT NULL 
                                AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) <= i.insuranceexclusiveduration
                                AND  (
                                    SELECT COUNT(insuranceagreements.insurancecompanyid)
                                    FROM insuranceagreements
                                    WHERE insuranceagreements.insurancecompanyid = d.insurancecompanyid
                                        AND insuranceagreements.customerid = a.customerid
                                ) > 0 THEN 1
END