sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのSTRING_AGG()関数

    PostgreSQLでは、STRING_AGG()を使用できます クエリから列を区切りリストとして返す関数。

    構文

    構文は次のようになります:

    string_agg ( value text, delimiter text ) → text
    string_agg ( value bytea, delimiter bytea ) → bytea

    ORDER BYを使用することもできます 句とDISTINCT この関数内からの句。これは、関数からの出力に影響します。詳細については、以下をご覧ください。

    次のクエリを実行するとします。

    SELECT PetName 
    FROM Pets;

    そして、次の結果が得られます:

    +---------+
    | petname |
    +---------+
    | Fluffy  |
    | Fetch   |
    | Scratch |
    | Wag     |
    | Tweet   |
    | Fluffy  |
    | Bark    |
    | Meow    |
    +---------+
    (8 rows)

    STRING_AGG()を使用できます これらのすべての行を区切りリストとして返します。

    これを行うには、PetNameを渡します 最初の引数として列、2番目の引数として選択した区切り文字:

    SELECT STRING_AGG(PetName, ',') 
    FROM Pets;

    結果:

    +-------------------------------------------------+
    |                   string_agg                    |
    +-------------------------------------------------+
    | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow |
    +-------------------------------------------------+
    (1 row)

    区切り文字の変更

    前の例では、区切り文字としてコンマを選択しました。ここに別の区切り文字があります:

    SELECT STRING_AGG(PetName, '-') 
    FROM Pets;

    結果:

    Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow

    空の文字列を使用して、すべての区切り文字を削除することもできます(値が連結されるように):

    SELECT STRING_AGG(PetName, '') 
    FROM Pets;

    そして、次の結果が得られます:

    FluffyFetchScratchWagTweetFluffyBarkMeow

    注文

    ORDER BYを使用できます STRING_AGG()内の句 独自の出力を注文する関数:

    SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;

    結果:

    Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

    昇順でした。

    ここでは降順です:

    SELECT STRING_AGG(PetName, ',' ORDER BY PetName DESC) FROM Pets;

    結果:

    Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark

    これはSTRING_AGG()の出力のみをソートすることに注意してください 関数– SELECTに適用される順序とは完全に独立しています ステートメント自体。

    DISTINCT 条項

    DISTINCTを使用できます 一意の値を返す句。つまり、重複する値がある場合、1つのオカレンスのみが返されます:

    SELECT STRING_AGG(DISTINCT PetName, ',' ORDER BY PetName ASC) FROM Pets;

    結果:

    Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag

    この場合、Fluffy 一度だけ表示されます。 DISTINCTなしで実行した場合 句、Fluffy 2回表示されます:

    SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;

    結果:

    Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

    グループ化されたクエリ結果

    STRING_AGG()を含めることができます GROUP BYを使用したクエリで 次のような結果を達成するための句:

    SELECT 
        PetTypeId,
        STRING_AGG(PetName, ',' ORDER BY PetName ASC)
    FROM Pets
    GROUP BY PetTypeId
    ORDER BY PetTypeId;

    結果:

    +-----------+-----------------------+
    | pettypeid |      string_agg       |
    +-----------+-----------------------+
    |         1 | Tweet                 |
    |         2 | Fluffy,Meow,Scratch   |
    |         3 | Bark,Fetch,Fluffy,Wag |
    +-----------+-----------------------+

    私のデータベースでは、実際のペットの種類の名前はPetTypesという別のテーブルにあります 。したがって、INNER JOINを実行できます。 PetTypesで 実際のペットの種類の名前を取得するための表:

    SELECT 
        pt.PetType,
        STRING_AGG(p.PetName, ',' ORDER BY p.PetName ASC)
    FROM Pets p
    INNER JOIN PetTypes pt ON
    p.PetTypeId = pt.PetTypeId
    GROUP BY pt.PetType
    ORDER BY pt.PetType ASC;

    結果:

    +---------+-----------------------+
    | pettype |      string_agg       |
    +---------+-----------------------+
    | Bird    | Tweet                 |
    | Cat     | Fluffy,Meow,Scratch   |
    | Dog     | Bark,Fetch,Fluffy,Wag |
    +---------+-----------------------+

    1. PyInstaller、スペックファイル、ImportError:「blah」という名前のモジュールがありません

    2. TDSサーバー-Transact-SQL(T-SQL)ステートメントを使用してSQLServerでSalesforceデータを操作する

    3. sqliteは2MBを超えるフィールドを取得します

    4. MSSQLサーバーの累積合計