嵌套的case语句,用于检查人员是否属于这两个ID

时间:2013-07-26 16:46:39

标签: sql oracle

我有一张包含以下记录的表格

ID NAME
-------
1  AAA
2  AAA
1  BBB
2  BBB
1  CCC

我想根据 NAME 所属的 ID 显示评论列。

例如,

NAME COMMENT
------------
AAA   1,2
BBB   1,2
CCC   1

我正在使用案例来获得结果。我的查询是 -

select name, 
case when (ID = 1) then (case when (ID = 2) then '1,2' else ID end) else ID end
from table1

然而,我没有得到理想的结果。

请让我知道我在查询中可以进行哪些更改以获得上述输出。

任何帮助都会很棒。感谢。

2 个答案:

答案 0 :(得分:3)

尝试使用此查询可能会有用:

SELECT 
  name, 
  listagg(id,',' ) WITHIN GROUP (ORDER BY name) 
FROM TEST
GROUP BY name

您可以试试here

注意: listagg 可从版本11G2获得。

此处link有更多解释。

答案 1 :(得分:2)

这是您的方法的概括。您需要使用聚合来执行您想要的操作。

这是一种方法,通过显式比较值:

select name,
       (case when MAX(case when id = 1 then id else '' end) = ''
             then MAX(case when id = 2 then id else '' end) 
             when MAX(case when id = 2 then id else '' end) = ''
             then MAX(case when id = 1 then id else '' end) 
             when MAX(case when id in (1, 2) then 1 end) is NULL
             then NULL
             else MAX(case when id = 1 then id else '' end) || ',' || MAX(case when id = 2 then id else '' end)
        end) as Comment
from table1
group by name;

这有点棘手,因为有时候你想要逗号,有时你却不想。

真正的解决方案是使用listagg(),如果您的Oracle版本支持它。