0

我有以下 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。

4

2 回答 2

2

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

于 2013-11-29T13:36:03.940 回答
1

这个的副本

如果您有 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;
于 2013-11-29T13:35:06.077 回答