ホームページ > データベース > mysql チュートリアル > LISTAGGを使用してOracleで複数の行を単一の行に連結するにはどうすればよいですか?

LISTAGGを使用してOracleで複数の行を単一の行に連結するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-06 03:11:38
オリジナル
622 人が閲覧しました

How to Concatenate Multiple Rows into a Single Row in Oracle Using LISTAGG?

Oracle で複数の行を 1 つの行に連結する

ストアド プロシージャを使用せずに Oracle で複数の行を 1 つの行に連結するには、Oracleユーザーは LISTAGG 句を使用できます。この句を使用すると、指定された区切り文字に基づいて効率的に行を統合できます。

データ シナリオ:

次のデータを考慮します:

question_id    element_id
1              7
1              8
2              9
3              10
3              11
3              12
ログイン後にコピー

望ましい出力:

望ましい結果は、各 question_id の element_id 値を連結し、次のようになります。

question_id    element_id
1              7,8
2              9
3              10,11,12
ログイン後にコピー

LISTAGG による解決策:

Oracle 11gR2 以降では、LISTAGG 句を使用できます。この連結を実現するには:

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;
ログイン後にコピー

このクエリLISTAGG 関数を使用して、question_id で定義された各グループ内の element_id 値を連結します。 ORDER BY 句を使用すると、連結前に各グループ内で値が順序付けされるようになります。

オーバーフローの処理:

結果の連結文字列が、その文字列に許可されている最大長を超える場合は注意してください。データ型 (VARCHAR2 の場合は 4000 文字など)、Oracle バージョン 12cR2 以降では、処理するオプションが提供されます。 overflow.

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) OVERFLOW TRUNCATE/ERROR
FROM YOUR_TABLE
GROUP BY question_id;
ログイン後にコピー

このクエリは、結果が最大長を超えた場合に切り詰めるか、エラーを発生させる ON OVERFLOW TRUNCATE/ERROR 句を指定します。

以上がLISTAGGを使用してOracleで複数の行を単一の行に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート