2010-09-30 15 views
4

Je refactorisation un vieux code et trébuché sur cette requête nommée (Il utilise en veille prolongée au-dessus de mysql):Pourquoi utiliser COALESCE() dans l'instruction SQL

delete F from 
    foo F 
inner join user DU on F.user_id = DU.id 
where 
(COALESCE(:userAlternateId,null) is null or DU.alternate_id like :userAlternateId) 
    and (COALESCE(:fooId,null) is null or F.foo_id like :fooId) 
    and (
     (COALESCE(:fromUpdated,null) is null or F.updated_at>=:fromUpdated) 
     and (COALESCE(:toUpdated,null) is null or F.updated_at<=:toUpdated) 
) 

Je ne comprends pas pourquoi ce COALESCE est utilisé de cette façon: COALESCE (: userAlternateId, null) est null

est-ce un hack de performances ou fait-il la base de données de requête indépendante ou ...?

BTW userAlternateId est une chaîne/varchar, d'autres id sont longs et à partir des dates

+0

Quelle saveur de SQL? – slugster

+0

@slugster il dit MySQL (premier paragraphe) - à moins que ce soit Hibernate HQL? – Rup

+0

Ahh bien sûr ... j'étais trop occupé à regarder le SQL pour le remarquer. COALESCEing un null à null m'a distrait. – slugster

Répondre

2

Je ne peux pas penser à une raison pour COALESCE être utilisé de cette façon.

déclaration suivante est équivalente

DELETE F 
FROM foo F 
     INNER JOIN User DU on F.user_id = DU.id 
WHERE (:userAlternateId IS NULL OR DU.alternate_id LIKE :userAlternateId) 
     AND (:fooId IS NULL OR F.foo_id LIKE :fooId) 
     AND (:fromUpdated IS NULL OR F.updated_at >= :fromUpdated) 
     AND (:toUpdated IS NULL OR F.updated_at <= :toUpdated) 
2

Eh oui, en pensant à ce plus, je parie sur ce que je suggérais dans le commentaire sur la question. Soit c'est du code généré automatiquement, et c'est un artefact de la façon dont le code générant ce code doit gérer des problèmes plus généraux que le cas particulier avec lequel il traite ici, ou c'est un artefact de quelqu'un qui passe de quelque chose de plus raisonnable à COALESCE(:userAlternateId,null) is null qui, bien que pas très sensible, est quelque chose que vous pouvez voir comment quelqu'un pourrait obtenir de A à B.