Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORACLE SQL LISTAGG,当我得到100个以上的结果时使用case_Sql_Oracle_Listagg - Fatal编程技术网

ORACLE SQL LISTAGG,当我得到100个以上的结果时使用case

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 ........... 但这不符合我

需要从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 ...........

但这不符合我的需要。

您可以这样做:

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”子句。它根据结果字符串的长度而不是聚合的元素数工作。