为什么在sql语句中使用COALESCE()?
我正在重构一些旧代码,偶然发现了这个命名查询 (它在mysql上使用hibernate):为什么在sql语句中使用COALESCE()?,sql,mysql,coalesce,Sql,Mysql,Coalesce,我正在重构一些旧代码,偶然发现了这个命名查询 (它在mysql上使用hibernate): 从中删除F 福福 F.user\u id=DU.id上的内部联接用户DU 哪里 (COALESCE(:userAlternateId,null)为null或DU.alternate_id,如:userAlternateId) 和(COALESCE(:fooId,null)为null或F.foo_id类似:fooId) 及( (合并(:fromUpdated,null)为null或F.updated\u a
从中删除F
福福
F.user\u id=DU.id上的内部联接用户DU
哪里
(COALESCE(:userAlternateId,null)为null或DU.alternate_id,如:userAlternateId)
和(COALESCE(:fooId,null)为null或F.foo_id类似:fooId)
及(
(合并(:fromUpdated,null)为null或F.updated\u at>=:fromUpdated)
和(COALESCE(:toUpdated,null)为null或F.updated_at我想不出有任何理由这样使用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)
删除F
来自富福
F.User\u id=DU.id上的内部联接用户DU
其中(:userAlternateId为NULL或DU.alternate_id,如:userAlternateId)
和(:fooId为NULL或F.foo_id类似于:fooId)
和(:fromUpdated为NULL或F.updated_at>=:fromUpdated)
及(:toUpdated为NULL或F.updated_at是的,仔细想想,我打赌我在对这个问题的评论中所建议的。要么是自动生成的代码,要么是生成代码的代码必须处理比它在这里处理的特定情况更一般的问题的方式的人工制品,要么是某人移动的人工制品从一些更合理的东西,比如,COALESCE(:userAlternateId,“not set”)=“not set”
到COALESCE(:userAlternateId,null)是空的,这虽然不是很合理,但你可以看到一个人是如何从A到B的。@Slaster他说MySQL(第一段)-除非这是Hibernate HQL?啊,当然……我忙着看SQL,没有注意到这一点。将空值合并到空值有点让我分心。很有可能它只是通过实验或修复而发生的更改而结束,它从合并(:val,-1)=-1
到合并(:val,null)为null
这毫无意义,你可以看到它是如何发生的。@Jon Hanna是的,我认为它一定是那样的,没有任何意义,否则,我将把它重构成更可读的东西,毕竟,如果一切都是完美的,你就不会重构它:)
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)