MariaDBでは、JSON_ARRAYAGG()
は、JSONまたはSQL値の特定のセットの各値の要素を含むJSON配列を返す組み込み関数です。
この関数は、単一の値に評価される列または式に作用します。これにより、結果セットを単一のJSON配列として集約できます。結果セットの各行は、配列内の単一の要素として終了します。
構文
構文は次のようになります:
JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
例
テーブルをクエリするとします:
SELECT PetName
FROM Pets;
そして、次の結果セットを取得します。
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+
結果は1つの列になり、各行には異なるペットの名前が含まれます。
すべてのペットをJSON配列にリストしたいとします(各ペット名が独自の配列要素になるようにします)。
JSON_ARRAYAGG()
を使用できます まさにそれを行うための機能:
SELECT JSON_ARRAYAGG(PetName)
FROM Pets;
結果:
+-------------------------------------------------------------------+ | JSON_ARRAYAGG(PetName) | +-------------------------------------------------------------------+ | ["Fluffy","Fetch","Scratch","Wag","Tweet","Fluffy","Bark","Meow"] | +-------------------------------------------------------------------+
列名をJSON_ARRAYAGG()
に渡すだけでした 働き。
明確な結果
DISTINCT
を追加できます 配列から重複する値を削除する句:
SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets;
結果:
+----------------------------------------------------------+ | JSON_ARRAYAGG(DISTINCT PetName) | +----------------------------------------------------------+ | ["Bark","Fetch","Fluffy","Meow","Scratch","Tweet","Wag"] | +----------------------------------------------------------+
Fluffy
に注意してください Fluffy
に対して、ここには1回だけ含まれていました 前の例に2回含まれています(Fluffy
と呼ばれる2匹のペットがいるため 。
結果を注文する
ORDER BY
を使用できます 配列要素の順序を指定する句:
SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets;
結果:
+-------------------------------------------------------------------+ | JSON_ARRAYAGG(PetName ORDER BY PetName DESC) | +-------------------------------------------------------------------+ | ["Wag","Tweet","Scratch","Meow","Fluffy","Fluffy","Fetch","Bark"] | +-------------------------------------------------------------------+
結果を制限する
LIMIT
を使用できます 配列要素の順序を指定する句:
SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets;
結果:
+--------------------------------+ | JSON_ARRAYAGG(PetName LIMIT 3) | +--------------------------------+ | ["Fluffy","Fetch","Scratch"] | +--------------------------------+
LIMIT
にオフセットを使用することもできます 条項:
SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2)
FROM Pets;
結果:
+-----------------------------------------+ | JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) | +-----------------------------------------+ | ["Scratch","Wag","Tweet"] | +-----------------------------------------+
または、LIMIT
を省略できます。 およびOFFSET
キーワードを入力し、数字を入れ替えて(コンマで区切り)、同じ結果を得る:
SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3)
FROM Pets;
結果:
+-----------------------------------+ | JSON_ARRAYAGG(PetName LIMIT 2, 3) | +-----------------------------------+ | ["Scratch","Wag","Tweet"] | +-----------------------------------+
グループ化された結果
SQL GROUP BY
を使用できます 別の列のグループ化に基づいて配列を生成する句。
元のクエリに列を追加するとします:
SELECT
PetTypeId,
PetName
FROM Pets;
結果:
+-----------+---------+ | PetTypeId | PetName | +-----------+---------+ | 2 | Fluffy | | 3 | Fetch | | 2 | Scratch | | 3 | Wag | | 1 | Tweet | | 3 | Fluffy | | 3 | Bark | | 2 | Meow | +-----------+---------+
これで、PetTypeId
ができました。 列とPetName
桁。これは、ペットの種類をそれぞれの名前に一致させます。
GROUP BY
の使用例を次に示します。 結果をPetTypeId
でグループ化する句 JSON_ARRAYAGG()
の使用中の列 機能:
SELECT
PetTypeId,
JSON_ARRAYAGG(PetName)
FROM Pets
GROUP BY PetTypeId;
結果:
+-----------+---------------------------------+ | PetTypeId | JSON_ARRAYAGG(PetName) | +-----------+---------------------------------+ | 1 | ["Tweet"] | | 2 | ["Fluffy","Scratch","Meow"] | | 3 | ["Fetch","Wag","Fluffy","Bark"] | +-----------+---------------------------------+
これにより、ペットの種類ごとに個別の配列を作成できました。
次のクエリはINNER JOIN
を使用しています 別のテーブルで、IDだけでなく実際のペットの種類を返します。
SELECT
pt.PetType,
p.PetName
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType;
結果:
+---------+---------+ | PetType | PetName | +---------+---------+ | Bird | Tweet | | Cat | Scratch | | Cat | Fluffy | | Cat | Meow | | Dog | Wag | | Dog | Fetch | | Dog | Bark | | Dog | Fluffy | +---------+---------+
各ペットの種類が最初の列に表示され、ペットの名前が2番目の列に表示されていることがわかります。
それでは、JSON_ARRAYAGG()
を使用しましょう。 機能:
SELECT
pt.PetType,
JSON_ARRAYAGG(p.PetName)
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
GROUP BY pt.PetType;
結果:
+---------+--------------------------+ | PetType | JSON_ARRAYAGG(p.PetName) | +---------+--------------------------+ | Bird | Tweet | | Cat | Scratch,Fluffy,Meow | | Dog | Wag,Fetch,Bark,Fluffy | +---------+--------------------------+