4

我正在重构一些旧代码并偶然发现了这个命名查询(它在 mysql 之上使用休眠):

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) is null

这是性能黑客还是它使查询数据库独立或......?

btwuserAlternateId是字符串/varchar,其他 id 是 long 并且from-to是日期

4

2 回答 2

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)
于 2010-09-30T11:30:07.593 回答
2

是的,再想一想,我打赌我在对该问题的评论中提出的建议。它要么是自动生成的代码,要么是生成该代码的代码必须处理比这里处理的特定情况更普遍的问题的人工制品,或者它是某人从更合理的东西转移到的人工制品COALESCE(:userAlternateId, "not set") = "not set"COALESCE(:userAlternateId,null) is null虽然不是很明智,你可以看到有人如何从 A 到 B。

于 2010-09-30T12:57:08.037 回答