我正在重构一些旧代码,无意中发现了这个命名查询
(它在mysql之上使用hibernate):

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是string/varchar,其他id是long,from-to是date

最佳答案

我想不出有什么理由把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)

10-02 03:24
查看更多