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