Зачем использовать COALESCE () в SQL-выражении? - PullRequest
4 голосов
/ 30 сентября 2010

Я рефакторинг старого кода и наткнулся на этот именованный запрос (он использует hibernate поверх 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 используется в этомfashion: COALESCE(:userAlternateId,null) is null

Это хак производительности или делает базу данных запроса независимой или ...?

btw userAlternateId это строка / varchar, другие идентификаторы long иfrom-to даты

Ответы [ 2 ]

2 голосов
/ 30 сентября 2010

Да, думая об этом больше, я ставлю на то, что я предложил в комментарии к вопросу.Либо это автоматически сгенерированный код, и это артефакт того, как код, генерирующий этот код, должен решать более общие проблемы, чем тот конкретный случай, с которым он здесь работает, или это артефакт того, что кто-то перешел от чего-то более разумного, например, COALESCE(:userAlternateId, "not set") = "not set" кCOALESCE(:userAlternateId,null) is null, хотя это и не очень разумно, но вы можете увидеть, как кто-то может добраться от А до Б.

2 голосов
/ 30 сентября 2010

Я не могу придумать причину, по которой 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)
...