需要从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 ...........
但这并不是我需要的。
答案 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