ORACLE SQL LISTAGG,当我获得超过100个结果的情况

时间:2017-09-27 13:56:41

标签: sql oracle listagg

需要从DB获取一些值为> “value1,value2,... value100” 但是如果我要回忆更多,那么需要做100个值 “value1,value2,... value100 ..”要知道它不是所有值,但我想显示最大值100现在我使用

select LISTAGG(CASE WHEN ROWNUM <=100 THEN within.number ELSE NULL END,', ') 
         WITHIN GROUP (ORDER BY within.number )
from ...........

但这并不是我需要的。

1 个答案:

答案 0 :(得分:2)

你可以这样做:

WITH sample_data AS (SELECT 1 ID, 'a' val FROM dual UNION ALL
                     SELECT 1 ID, 'b' val FROM dual UNION ALL
                     SELECT 1 ID, 'c' val FROM dual UNION ALL
                     SELECT 2 ID, 'd' val FROM dual UNION ALL
                     SELECT 2 ID, 'e' val FROM dual UNION ALL
                     SELECT 2 ID, 'f' val FROM dual UNION ALL
                     SELECT 2 ID, 'g' val FROM dual UNION ALL
                     SELECT 3 ID, 'h' val FROM dual UNION ALL
                     SELECT 3 ID, 'i' val FROM dual UNION ALL
                     SELECT 3 ID, 'h' val FROM dual UNION ALL
                     SELECT 3 ID, 'j' val FROM dual UNION ALL
                     SELECT 3 ID, 'k' val FROM dual UNION ALL
                     SELECT 4 ID, 'l' val FROM dual UNION ALL
                     SELECT 4 ID, 'm' val FROM dual UNION ALL
                     SELECT 5 ID, 'n' val FROM dual)
SELECT ID,
       listagg(CASE WHEN rn <= 3 THEN val ELSE '...' END, ',') WITHIN GROUP (ORDER BY val) vals
FROM   (SELECT ID,
               val,
               row_number() OVER (PARTITION BY ID ORDER BY val) rn
        FROM   sample_data)
WHERE  rn <= 4 -- max amount of expected elements + 1
GROUP BY ID;

 ID VALS
--- -----------
  1 a,b,c
  2 d,e,f,...
  3 h,h,i,...
  4 l,m
  5 n

在我的例子中,我想只显示三个元素,以及&#34; ...&#34;如果有其他可用元素。因此,首先,我们将结果过滤为每个id的前四行。

为此,我使用ROW_NUMBER分析函数为每一行标记每个id按升序排列的数字。

一旦我们知道行号,我们就可以过滤行以返回预期的元素数+ 1 - 我们需要额外的行来知道是否有更多行可用。就我而言,这意味着我们需要获得前4行。

接下来,我们需要一个case语句来输出前三个元素的实际值,&#34; ...&#34;对于第四个元素,如果存在。

然后我们可以将其纳入LISTAGG并瞧!

当然,以上假设您的数据库不是12.2版 - 如果是,那么您可以利用新的溢出增强功能 - 请参阅here for more information