sql >> データベース >  >> RDS >> MariaDB

MariaDB JSON_ARRAYAGG()の説明

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

    1. MySQL SELECT WHERE日時は日と一致します(必ずしも時刻とは限りません)

    2. MySQLデータベースをSQLiteデータベースにエクスポートする

    3. XMLをCLOB列からXMLType列に変換するときにエラーが発生しました

    4. PostgreSQLギャップレスシーケンス