ホームページ >データベース >mysql チュートリアル >Oracle で MySQL の GROUP_CONCAT を置き換える方法は?

Oracle で MySQL の GROUP_CONCAT を置き換える方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-15 12:25:44676ブラウズ

How to Replace MySQL's GROUP_CONCAT in Oracle?

Oracle の MySQL の GROUP_CONCAT に相当

MySQL の GROUP_CONCAT 関数は、複数の行を単一の文字列に効率的に結合します。 Oracle では、データベースのバージョンに応じて、同じ結果を達成するためのいくつかの方法を提供しています。

LISTAGG: 推奨される方法 (Oracle 11g 以降)

LISTAGG 関数は、最新の Oracle バージョン (11g 以降) で推奨されるアプローチです。これは、グループ内の値を連結するためのクリーンで効率的なソリューションを提供します。

<code class="language-sql">SELECT
    col1,
    LISTAGG(col2, ', ') WITHIN GROUP (ORDER BY col2) AS names
FROM table_x
GROUP BY col1</code>

このクエリは、行を col1 でグループ化し、対応する col2 値をカンマとスペースで区切って col2 順に連結します。

カスタム関数: 古い Oracle バージョン (10g 以前) の場合

LISTAGG がない Oracle 10g 以前のバージョンの場合、カスタム関数が必要です:

<code class="language-sql">CREATE OR REPLACE FUNCTION get_concatenated_values (input_val IN NUMBER)
  RETURN VARCHAR2
IS
  concatenated_text VARCHAR2(10000) := NULL;
BEGIN
  FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP
    concatenated_text := concatenated_text || ',' || x.col2;
  END LOOP;
  RETURN LTRIM(concatenated_text, ',');
END;
/</code>

使用法:

<code class="language-sql">SELECT col1, get_concatenated_values(col1) FROM table_name;</code>

この関数は、入力値に一致する行を反復処理し、col2 値を文字列に追加します。 LTRIM 関数は、先頭のカンマを削除します。

WM_CONCAT: 慎重に使用してください

一部の古い Oracle バージョンには WM_CONCAT が含まれている場合があります。ただし、これはサポートされていない関数であり、その動作はバージョン間で一貫性がない可能性があります。 したがって、WM_CONCAT を避け、代わりに LISTAGG またはカスタム関数を使用することを強くお勧めします。

<code class="language-sql">SELECT col1, WM_CONCAT(col2) FROM table_name GROUP BY col1;</code>

Oracle のバージョンに適した方法を選択してください。 LISTAGG は、新しいバージョンにとって推奨され、最も信頼性の高いソリューションです。 古いバージョンの場合は、カスタム関数が堅牢な代替手段を提供します。 絶対に必要な場合を除き、WM_CONCAT は避け、その制限を理解してください。

以上がOracle で MySQL の GROUP_CONCAT を置き換える方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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