教义:带有 CASE WHEN 的 GROUP_CONCAT 的语法是啥?

Posted

技术标签:

【中文标题】教义:带有 CASE WHEN 的 GROUP_CONCAT 的语法是啥?【英文标题】:Doctrine : Which syntax for GROUP_CONCAT with a CASE WHEN?教义:带有 CASE WHEN 的 GROUP_CONCAT 的语法是什么? 【发布时间】:2017-01-19 18:17:15 【问题描述】:

我有这个在 phpMyAdmin 中运行良好的 SQL 查询:

SELECT `Tag_Type_Code`, `Tag_Type`,
    GROUP_CONCAT(`Tag_Code` ORDER BY `Tag_Name`) as tagCode,
    GROUP_CONCAT(`Tag_Name` ORDER BY `Tag_Name`) as tagName,
    GROUP_CONCAT(CASE WHEN isnull(`Tag_Picto`) THEN 'NULL' ELSE `Tag_Picto` END ORDER BY `Tag_Name`) as tagPicto
FROM tags
WHERE `modele_code` = "MYCODE"
GROUP BY `Tag_Type_Code`
ORDER BY `tag_Type` ASC

我想在 Doctrine 和 Symfony3 中这样做,我试过了,但在 CASE WHEN 附近出现语法错误。

$this->getEntityManager()->createQuery(
    'SELECT tag.typeCode, tag.type,
        GROUP_CONCAT(tag.code ORDER BY tag.name) as tagCode,
        GROUP_CONCAT(tag.name ORDER BY tag.name) as tagName,
        GROUP_CONCAT(CASE WHEN tag.picto IS NULL THEN "NULL" ELSE tag.picto END ORDER BY tag.name) as tagPicto
    FROM AppBundle:Tag tag
    WHERE tag.modelCode = :code
    GROUP BY tag.typeCode
    ORDER BY tag.type ASC'
)->setParameter('code', $modelCode)
->getResult();

或者这个:

'SELECT tag.typeCode, tag.type,
    CASE WHEN tag.picto IS NULL THEN "NULL" ELSE tag.picto END as picto
    GROUP_CONCAT(tag.code ORDER BY tag.name) as tagCode,
    GROUP_CONCAT(tag.name ORDER BY tag.name) as tagName,
    GROUP_CONCAT(picto ORDER BY tag.name) as tagPicto
FROM AppBundle:Tag tag
WHERE tag.modelCode = :code
GROUP BY tag.typeCode
ORDER BY tag.type ASC'

我也尝试使用 beberlei/DoctrineExtensions bundle 中的 IfElse 和 IfNull 扩展,但我找不到正确的语法。

此查询不使用 CASE WHEN。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我认为您的问题在于"NULL" 处的双引号,请使用单引号并将它们转义:

$this->getEntityManager()->createQuery(
    'SELECT tag.typeCode, tag.type,
        GROUP_CONCAT(tag.code ORDER BY tag.name) as tagCode,
        GROUP_CONCAT(tag.name ORDER BY tag.name) as tagName,
        GROUP_CONCAT(CASE WHEN tag.picto IS NULL THEN \'NULL\' ELSE tag.picto END ORDER BY tag.name) as tagPicto
    FROM AppBundle:Tag tag
    WHERE tag.modelCode = :code
    GROUP BY tag.typeCode
    ORDER BY tag.type ASC'
)->setParameter('code', $modelCode)
->getResult();

【讨论】:

我无法再次使用 NULL 进行测试,因为我更改了表中的值。显然 GROUP_CONCAT 和 CASE WHEN 在同一个查询中不起作用时,我在这里发布了这个问题:github.com/beberlei/DoctrineExtensions/issues/222 但是,我应该在查询中使用 setParameter() 来设置 NULL 值:CASE WHEN tag.picto = :search THEN :replace ELSE tag.picto END [...] ->setParameters(array('search' => NULL, 'replace' => 'NULL'));

以上是关于教义:带有 CASE WHEN 的 GROUP_CONCAT 的语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

带有条件的多列上的 CASE WHEN 表达式

语法错误,Map<> 字段上的 QueryDSL “Case When”,带有聚合

总结大量 CASE WHEN 的最佳方式

选择“case when”...产生分组结果...如何获取汇总数据?

case when 用法

带有case语句的bigquery中的子选择