Condition IF() dans la clause WHERE

Par Renand, il y a 4 ans


Base de données MySQL

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

1 réponse

Renand, il y a 4 ans

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