MariaDBでは、JSON_OBJECTAGG()
は、2つの引数に基づいて、キーと値のペアを含むJSONオブジェクトを返す組み込み関数です。
構文
構文は次のようになります:
JSON_OBJECTAGG(key, value)
この関数は、引数として、単一の値または2つの列名に評価される2つの式を受け入れます。最初の引数はキーで、2番目の引数はその値です。
例
簡単な例を次に示します。
SELECT JSON_OBJECTAGG("name", "Homer");
結果:
+---------------------------------+ | JSON_OBJECTAGG("name", "Homer") | +---------------------------------+ | {"name":"Homer"} | +---------------------------------+
この例は関数がどのように機能するかを示していますが、列やその他の式を操作するときに真のメリットがあります。
以下は、引数にデータベース列を使用する例です。
データベースの例
テーブルをクエリするとします:
SELECT
PetName,
DOB
FROM Pets;
そして、次の結果セットを取得します。
+---------+------------+ | PetName | DOB | +---------+------------+ | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +---------+------------+
次に、各列をJSON_OBJECTAGG()
に渡すクエリを実行してみましょう。 関数、結果がJSONオブジェクトとして返されるようにします:
SELECT JSON_OBJECTAGG(PetName, DOB)
FROM Pets
WHERE DOB < '2020-04-01';
結果:
+--------------------------------------------------------------------+ | JSON_OBJECTAGG(PetName, DOB) | +--------------------------------------------------------------------+ | {"Fetch":"2019-08-16", "Scratch":"2018-10-01", "Wag":"2020-03-15"} | +--------------------------------------------------------------------+
列名をJSON_OBJECTAGG()
に渡すだけでした 働き。
WHERE
も使用しました 結果を少し絞り込むための句。
グループ化された結果
SQL GROUP BY
を使用できます 別の列のグループ化に基づいてJSONオブジェクトを生成する句。
元のクエリに列を追加するとします:
SELECT
PetTypeId,
PetName,
DOB
FROM Pets;
結果:
+-----------+---------+------------+ | PetTypeId | PetName | DOB | +-----------+---------+------------+ | 2 | Fluffy | 2020-11-20 | | 3 | Fetch | 2019-08-16 | | 2 | Scratch | 2018-10-01 | | 3 | Wag | 2020-03-15 | | 1 | Tweet | 2020-11-28 | | 3 | Fluffy | 2020-09-17 | | 3 | Bark | NULL | | 2 | Meow | NULL | +-----------+---------+------------+
これで、PetTypeId
ができました。 列とPetName
およびDOB
列。これは、ペットの種類を各ペットに一致させます。
GROUP BY
の使用例を次に示します。 結果をPetTypeId
でグループ化する句 JSON_OBJECTAGG()
の使用中の列 機能:
SELECT
PetTypeId,
JSON_OBJECTAGG(PetName, DOB)
FROM Pets
GROUP BY PetTypeId;
結果:
+-----------+--------------------------------------------------------------------------------+ | PetTypeId | JSON_OBJECTAGG(PetName, DOB) | +-----------+--------------------------------------------------------------------------------+ | 1 | {"Tweet":"2020-11-28"} | | 2 | {"Fluffy":"2020-11-20", "Scratch":"2018-10-01", "Meow":null} | | 3 | {"Fetch":"2019-08-16", "Wag":"2020-03-15", "Fluffy":"2020-09-17", "Bark":null} | +-----------+--------------------------------------------------------------------------------+
これにより、ペットの種類ごとに個別のJSONオブジェクトを作成できました。
次のクエリはINNER JOIN
を使用しています 別のテーブルで、IDだけでなく実際のペットの種類を返します。
SELECT
pt.PetType,
p.PetName,
p.DOB
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType;
結果:
+---------+---------+------------+ | PetType | PetName | DOB | +---------+---------+------------+ | Bird | Tweet | 2020-11-28 | | Cat | Scratch | 2018-10-01 | | Cat | Fluffy | 2020-11-20 | | Cat | Meow | NULL | | Dog | Wag | 2020-03-15 | | Dog | Fetch | 2019-08-16 | | Dog | Bark | NULL | | Dog | Fluffy | 2020-09-17 | +---------+---------+------------+
ペットタイプIDだけでなく、実際のペットタイプが最初の列に表示されていることがわかります。
それでは、JSON_OBJECTAGG()
を使用しましょう。 機能:
SELECT
pt.PetType,
JSON_OBJECTAGG(p.PetName, p.DOB)
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
GROUP BY pt.PetType;
結果:
+---------+--------------------------------------------------------------------------------+ | PetType | JSON_OBJECTAGG(p.PetName, p.DOB) | +---------+--------------------------------------------------------------------------------+ | Bird | {"Tweet":"2020-11-28"} | | Cat | {"Scratch":"2018-10-01", "Fluffy":"2020-11-20", "Meow":null} | | Dog | {"Wag":"2020-03-15", "Fetch":"2019-08-16", "Bark":null, "Fluffy":"2020-09-17"} | +---------+--------------------------------------------------------------------------------+