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);

最後に、IDS 型と NUMBER 型の 2 つのパラメーターを受け取る関数があります。ID 列を OC_YEAR 列の下にグループ化する IDS 変数に収集し、これら 2 つの引数を関数に送信する方法はありますか。明確にするために、上記のクエリの結果セットを次のようにグループ化する必要があります。

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

正確ではありませんが、MySQL の GROUP_CONCAT に似たものです。

4

2 に答える 2

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 に答える