ホームページ >データベース >mysql チュートリアル >Oracle でストアド プロシージャを使用せずに複数の行を 1 つの行に連結するにはどうすればよいですか?

Oracle でストアド プロシージャを使用せずに複数の行を 1 つの行に連結するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-05 20:02:401038ブラウズ

How Can I Concatenate Multiple Rows into a Single Row in Oracle Without Using a Stored Procedure?

ストアド プロシージャを使用せずに Oracle で複数の行を 1 つの行に連結する

Oracle でデータを操作する場合、複数の行を 1 つの行に結合する必要があります。従来、これはストアド プロシージャを使用して実現できました。ただし、Oracle の LISTAGG 句を使用した、より効率的で簡単な解決策があります。

Oracle の LISTAGG 句

Oracle 11gR2 で導入された LISTAGG 句を使用すると、次のことが可能になります。複数の値を単一の文字列にまとめます。次の構文を使用します:

LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY column)
  • 式: 連結する列または式。
  • 区切り文字:値の間に使用する区切り文字 (例:カンマ).
  • column: 各グループ内の値の順序付けに使用される列。

次のデータセットを考えてみましょう:

question_id element_id
1 7
1 8
2 9
3 10
3 11
3 12

連結するには各 question_id の element_id 値を 1 つの行にまとめると、次のクエリを使用できます。

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM your_table
GROUP BY question_id;

Output

question_id element_id
1 7,8
2 9
3 10,11,12

大きな結果に関する考慮事項Strings

結果の文字列が 4000 を超えると予想される場合文字 (VARCHAR2 データ型の最大長) を使用するには、Oracle 12cR2 で導入された次の拡張機能を使用できます。

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) ON OVERFLOW TRUNCATE/ERROR
FROM your_table
GROUP BY question_id;
  • ON OVERFLOW TRUNCATE:指定された長さを超えています。
  • ON OVERFLOW ERROR: 結果の文字列が指定された長さを超える場合、エラーが発生します。

以上がOracle でストアド プロシージャを使用せずに複数の行を 1 つの行に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。