我在做一个symfony3.4项目。
我想订一张table updated_at
如果存在(不为空),则按 created_at
如果没有。
在sql中,这是有效的:
SELECT * FROM `contract`
ORDER BY
(CASE WHEN ISNULL(`updated_at`) THEN `created_at` ELSE `updated_at` END)
DESC
我尝试了很多东西,但我没有设法使它与条令查询建设者的工作。
首先,我尝试了以下方法(语法错误):
$contracts = $em->createQuery(
'SELECT c
FROM AppBundle:Contract c
ORDER BY (CASE WHEN c.updatedAt = :update THEN c.createdAt ELSE c.updatedAt END) DESC')
->setParameter('update', NULL)
->getResult();
然后,我根据这个主题尝试了这个,但是没有结果(没有错误):
$contracts = $rp->createQueryBuilder('c')
->select('(CASE WHEN c.updatedAt != :update THEN 1 ELSE 0 END) AS HIDDEN orderDate')
->orderBy('orderDate', 'DESC')
->addOrderBy('c.createdAt', 'DESC')
->setParameter('update', NULL)
->getQuery()->getResult();
如果合同已更新,如何按更新日期排序;如果合同未修改,如何按创建日期排序?
如果有帮助的话,我可以将doctrineextensions包用于其他查询,我看到了 IfNull
以及 IfElse
但我不知道如何在我的案例中使用它们。
1条答案
按热度按时间pn9klfpd1#
经过几次尝试,我终于找到了解决办法。
使用
COALESCE
:返回列表中第一个不为null的值,因此如果a为null,b为not null,则COALESCE(A,B)
将返回b。无需使用doctrineextensions包。