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 | +---------+-----------------------+