使用 LISTAGG 和 CASE 语句的 SQL 查询

Posted

技术标签:

【中文标题】使用 LISTAGG 和 CASE 语句的 SQL 查询【英文标题】:SQL Query with LISTAGG and CASE Statement 【发布时间】:2017-04-10 12:53:52 【问题描述】:

谁能帮我解决以下问题,

我想同时使用CASELISTAGG

我正在使用 sql

LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) AS SERVICES

所以输出只是正常工作

**SERVICES**
Row 1 : 50|100|128
Row 2 : 100|100|128

所以在这里我想写一个案例或 if else 逻辑(如果 50|100|128)它应该反映为 Yes else if 100|100|128 那么它应该反映为 No

你能帮我解决这个问题吗?

【问题讨论】:

使用listagg 表明这是针对oracle 的。我删除了 mysql 标签并添加了 oracle。 编辑您的问题并提供示例数据和所需的结果。 【参考方案1】:

您可以使用listagg() 中的case 执行此操作:

LISTAGG(CASE WHEN G.IGROUP_ID IN (50, 100, 128) THEN 'YES' ELSE 'NO' END ,'|')
    WITHIN GROUP (ORDER BY G.igroup_id) AS SERVICES

这假定所有不是YES 的都是NO。如果这不是真的,那么只需添加另一个 WHEN 子句。

编辑:

对这个问题的字面解释是:

(CASE LISTAGG(G.IGROUP_ID , '|') WITHIN GROUP (ORDER BY G.igroup_id) 
      WHEN '50|100|128' THEN 'Yes'
      WHEN '100|100|128' THEN 'No'
 END) AS SERVICES

【讨论】:

谢谢@Gordon,它的工作原理就像 Charm,只是想获得一些知识,无论如何我可以在 Case 中使用 Like ,例如,像 '50|100%' THEN 作为 YES 和 '100| 100%' 那么没有。我想以这种方式制作 END) 第一个 SQL 中的 END 之后不应出现右括号 @deadend 。 . .谢谢。【参考方案2】:
CASE WHEN LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) = '50|100|128' THEN 'YES'
WHEN LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) = '100|100|128' THEN 'NO' END AS COL_NAME

或者您可以将LISTAGG(G.IGROUP_ID,'|') WITHIN GROUP (ORDER BY G.igroup_id) AS SERVICES 保留在子查询中,并在外部查询中应用case

【讨论】:

以上是关于使用 LISTAGG 和 CASE 语句的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL ORA-00907: CASE 语句中缺少右括号错误

将“LISTAGG”转换为“XMLAGG”

sql中的case语句对齐和清理

MySql 怎么实现 LISTAGG

SQL里if语句和case语句有啥区别吗?哪个使用更高效?就是查询更优化?

H2 用户使用“WITHIN GROUP”定义的 ListAgg 函数