在 SQL 语句中收集到 VARRAY [重复]

Posted

技术标签:

【中文标题】在 SQL 语句中收集到 VARRAY [重复]【英文标题】:Collecting into VARRAY inside SQL statement [duplicate] 【发布时间】:2013-11-29 13:23:19 【问题描述】:

我有以下 SQL 查询:

SELECT ID, OC_YEAR FROM ACCOUNTS;

此查询返回以下结果集:

       ID       |     OC_YEAR          
------------------------------------    
       10            2006
       10            2007
       10            2008
       11            2006
       11            2008

另一方面,我有一个自定义类型

 create TYPE IDS AS VARRAY(10) OF NUMBER(5);

最后我有一个函数可以接收 2 个类型为 IDS 和 NUMBER 的参数。有没有办法可以将 ID 列收集到 IDS 变量中,将它们分组到 OC_YEAR 列下,并将这两个参数发送到我的函数。为了更清楚,我需要像这样对上述查询的结果集进行分组:

(10,11):2006
(10):2007
(10,11):2008

不完全是,但类似于 mysql 中的 GROUP_CONCAT。

【问题讨论】:

正如我所说,我不是在寻找 GROUP_CONCAT 的完全等价物 答案还是差不多的 ;-) 【参考方案1】:

Oracle 11.2 引入了函数LISTAGG,其作用与 GROUP_CONCAT 相同。如果您没有可用的 Oracle 11.2,则必须将其封装在一个函数中。

【讨论】:

【参考方案2】:

this one: 的副本

如果您有 Oracle 10G:

CREATE OR REPLACE FUNCTION GET_COMMA_SEPARATED_VALUE ( INPUT_VAL IN NUMBER )
    RETURN VARCHAR2
IS
    RETURN_TEXT VARCHAR2 ( 10000 ) := NULL;
BEGIN
    FOR X IN ( SELECT
                  ID
            FROM
                  ACCOUNTS
            WHERE
                  OC_YEAR = INPUT_VAL )
    LOOP
        RETURN_TEXT :=
               RETURN_TEXT
            || ','
            || X.ID;
    END LOOP;

    RETURN LTRIM ( RETURN_TEXT,
                ',' );
END;
/

所以,你可以这样做:

SELECT
      GET_COMMA_SEPARATED_VALUE ( ID ),
      OC_YEAR
FROM
      ACCOUNTS;

如果你有 oracle 11g,你可以使用 listagg :

SELECT
      LISTAGG ( OC_YEAR,
              ', ' )
      WITHIN GROUP (ORDER BY ID),
      OC_YEAR
FROM
      ACCOUNTS
GROUP BY
      OC_YEAR;

【讨论】:

我认为你的 10g 代码有错误。函数不应该期望OC_YEAR 作为参数吗? 感谢您的评论。更正

以上是关于在 SQL 语句中收集到 VARRAY [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 PL/SQL VARRAY 中使用 ROWTYPE 会产生编译错误

我应该如何使用 jdbc 从 plsql 将 varray 发送到 java? [复制]

如何在表列中访问 SQL 中的 varray 元素

如何通过 PL/SQL 中的 VARRAY 函数中的变量传递字符串值

在 Oracle SQL 中创建和填充 Varray

Oracle PL/SQL:如何从 VARRAY 的 REF 中进行 DEREF?