我有以下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);
最后我有一个函数可以收到IDS和NUMBER类型的2个参数。有没有办法可以将ID列收集到一个IDS变量中,将它们分组到OC_YEAR列下,并将这两个参数发送给我的函数。为了更清楚,我需要将上述查询的结果集分组如下:
(10,11):2006
(10):2007
(10,11):2008
不完全是类似于MySQL中的GROUP_CONCAT。
答案 0 :(得分:2)
Oracle 11.2引入了函数LISTAGG,它与GROUP_CONCAT一样。如果您没有可用的Oracle 11.2,则必须将其封装在函数中。
答案 1 :(得分: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;