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