2010-09-30 36 views
4

我重構一些舊代碼,並偶然發現了這個命名查詢。 (它使用Hibernate在MySQL的頂部):爲什麼要使用COALESCE()在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) 
) 

我不明白爲什麼這個COALESCE正在使用這種方式: COALESCE(:userAlternateId,null)爲空

這是一個性能破解或它使查詢數據庫獨立或...?

BTW userAlternateId是一個字符串/ VARCHAR,其它ID是多頭和對日期有

+0

SQL有什麼特色? – slugster 2010-09-30 11:21:30

+0

@slugster他說MySQL(第一段) - 除非這是Hibernate HQL? – Rup 2010-09-30 11:22:58

+0

啊,當然......我太忙了,看着SQL來注意到這一點。將null歸結爲null使我分心。 – slugster 2010-09-30 11:31:16

回答

2

我想不出使用這種方式任何理由COALESCE。

以下語句是等效

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

是的,想着這個多,我打賭什麼我對這個問題的意見建議。它可以是自動生成的代碼,它是生成代碼的代碼必須處理比它在這裏處理的特定情況更普遍的問題的一種人造物,或者是某人從諸如COALESCE(:userAlternateId, "not set") = "not set"之類的更合理的東西移動到COALESCE(:userAlternateId,null) is null的人造物,雖然不是很明智,但可以看到某人可以從A到B如何獲得。

相關問題