ORACLE SQL LISTAGG,当我得到100个以上的结果时使用case
需要从DB获取一些值,如> 价值1,价值2。。。价值100 但万一我收到超过100个值,我需要做些什么 价值1,价值2。。。价值100。。要知道它不是所有的值,但我想显示最大值100现在我使用ORACLE SQL LISTAGG,当我得到100个以上的结果时使用case,sql,oracle,listagg,Sql,Oracle,Listagg,需要从DB获取一些值,如> 价值1,价值2。。。价值100 但万一我收到超过100个值,我需要做些什么 价值1,价值2。。。价值100。。要知道它不是所有的值,但我想显示最大值100现在我使用 select LISTAGG(CASE WHEN ROWNUM <=100 THEN within.number ELSE NULL END,', ') WITHIN GROUP (ORDER BY within.number ) from ........... 但这不符合我
select LISTAGG(CASE WHEN ROWNUM <=100 THEN within.number ELSE NULL END,', ')
WITHIN GROUP (ORDER BY within.number )
from ...........
但这不符合我的需要。您可以这样做:
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
在我的示例中,我只想显示三个元素,以及。。。如果有其他元素可用。因此,首先,我们将结果过滤到每个id的前四行
为此,我使用ROW_NUMBER分析函数为每一行标记一个数字,每个id按升序排列
一旦我们知道了行号,我们就可以过滤行以返回预期的元素数+1-我们需要额外的行来知道是否有更多行可用。在我的例子中,这意味着我们需要得到前4行
接下来,我们需要一个case语句来输出前三个元素的实际值,然后。。。对于第四个元素(如果存在)
然后我们可以将其合并到Listag和voila中
当然,以上假设您的数据库不是12.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
在我的示例中,我只想显示三个元素,以及。。。如果有其他元素可用。因此,首先,我们将结果过滤到每个id的前四行
为此,我使用ROW_NUMBER分析函数为每一行标记一个数字,每个id按升序排列
一旦我们知道了行号,我们就可以过滤行以返回预期的元素数+1-我们需要额外的行来知道是否有更多行可用。在我的例子中,这意味着我们需要得到前4行
接下来,我们需要一个case语句来输出前三个元素的实际值,然后。。。对于第四个元素(如果存在)
然后我们可以将其合并到Listag和voila中
当然,以上假设您的数据库不是12.2版-如果是,那么您可以利用新的溢出增强功能-请参见,因为Oracle 12.2可以使用“on overflow”子句。它根据结果字符串的长度工作,而不是根据聚合的元素数。由于Oracle 12.2,您可以使用“on overflow”子句。它根据结果字符串的长度而不是聚合的元素数工作。