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

なぜこれがこのように使用されているのかわかりませんCOALESCECOALESCE(:userAlternateId,null) is null

これはパフォーマンスハックですか、それともクエリデータベースを独立させますか...?

btwuserAlternateIdは文字列/変数であり、他のIDはlongでありfrom-to、日付です

4

2 に答える 2

2

ええ、これについてもっと考えてみると、質問に対するコメントで私が提案したことに賭けています。それは自動生成されたコードであり、そのコードを生成するコードがここで扱っている特定のケースよりも一般的な問題を処理しなければならない方法のアーティファクトであるか、または のようなより合理的なものから誰かが移動したアーティファクトCOALESCE(:userAlternateId, "not set") = "not set"ですCOALESCE(:userAlternateId,null) is null。あまり賢明ではありませんが、誰かが A から B に移動する方法を見ることができるものです。

于 2010-09-30T12:57:08.037 に答える
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 に答える