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

SQL Server FOR JSON PATHの例(T-SQL)

    SQL Serverを使用する場合は、FOR JSONを使用できます 結果をJSONとしてフォーマットするためのクエリの句。これを行うときは、AUTOのいずれかを選択する必要があります またはPATH オプション。この記事には、PATHの使用例が含まれています オプション。

    構文

    構文は次のようになります:

    SELECT ...
      (your query goes here)
    FOR JSON PATH;
    

    つまり、基本的には、FOR JSON PATHを追加するだけです。 クエリの最後まで。

    例1-基本的な使用法

    実例を示します。

    USE Music;
    SELECT TOP 3 
      AlbumName, 
      ReleaseDate
    FROM Albums
    FOR JSON PATH;
    

    結果:

    [
        {
            "AlbumName": "Powerslave",
            "ReleaseDate": "1984-09-03"
        },
        {
            "AlbumName": "Powerage",
            "ReleaseDate": "1978-05-05"
        },
        {
            "AlbumName": "Singing Down the Lane",
            "ReleaseDate": "1956-01-01"
        }
    ]
    

    そのため、結果は行や列ではなく、適切にフォーマットされたJSONドキュメントとして出力されます。

    この場合、TOP 3を使用しました 結果セットを3つの結果に制限します。

    単一行の結果?

    結果は、最初は1つの行と1つの列に表示され、次のような1つの長い行として表示される場合があります。

    この場合は、結果セットをクリックしてみてください。データベース管理ソフトウェアによっては、上記の例のようにJSONドキュメントが起動するはずです。

    これが説明どおりに機能するかどうかは、SQLServerのクエリに使用するソフトウェアによって異なります。

    これを書いている時点では、SQL Operations Studio(Azure Data Studioに名前が変更されています)を使用しているときに、これは問題なく機能しました。 VSCodeでMSSQL拡張機能を使用する場合にも正常に機能しました。ただし、SSMSは、結果を1つの長い行としてのみフォーマットします(ただし、JSON形式のままです)。

    また、コマンドラインツールを使用してさまざまな程度の成功を収めました。

    また、結果セットの大きさによっては、結果が最初は複数の行に分散されている場合もあります。

    満足のいく方法で結果を表示できない場合は、別のツールを試してください。

    例2–複数のテーブルにまたがるクエリ

    この例では、1対多の関係にある2つのテーブルをクエリします。この場合、各アーティストは多くのアルバムを持つことができ、サブクエリを使用して各アーティストのアルバムを取得します。

    USE Music;
    SELECT TOP 2 ArtistName,
        (SELECT AlbumName 
            FROM Albums
            WHERE Artists.ArtistId = Albums.ArtistId
            FOR JSON PATH) AS Albums
    FROM Artists
    ORDER BY ArtistName
    FOR JSON PATH;
    

    結果:

    [
        {
            "ArtistName": "AC/DC",
            "Albums": [
                {
                    "AlbumName": "Powerage"
                }
            ]
        },
        {
            "ArtistName": "Allan Holdsworth",
            "Albums": [
                {
                    "AlbumName": "All Night Wrong"
                },
                {
                    "AlbumName": "The Sixteen Men of Tain"
                }
            ]
        }
    ]
    

    この場合、各アルバムは「アルバム」の下にネストされています。これは、アルバムがサブクエリを介して返されるためです。

    例3–ドット表記のネストされた出力

    PATHを使用する場合 オプションで、ドットで区切られた列名を使用してネストされたオブジェクトを作成できます。

    これを行うには、ドットで区切られたエイリアスを使用します。次に例を示します:

    USE Music;
    SELECT TOP 3 
      AlbumId,
      AlbumName AS 'Details.Album Name', 
      ReleaseDate AS 'Details.Release Date'
    FROM Albums
    FOR JSON PATH;
    

    結果:

    [
        {
            "AlbumId": 1,
            "Details": {
                "Album Name": "Powerslave",
                "Release Date": "1984-09-03"
            }
        },
        {
            "AlbumId": 2,
            "Details": {
                "Album Name": "Powerage",
                "Release Date": "1978-05-05"
            }
        },
        {
            "AlbumId": 3,
            "Details": {
                "Album Name": "Singing Down the Lane",
                "Release Date": "1956-01-01"
            }
        }
    ]
    

    例4–ルートノードを追加する

    ROOT()を使用できます ルートノードを出力に追加するオプション。これにより、単一の最上位要素が出力に追加されます。これを行うには、ROOT()を追加するだけです。 ルートノードに付ける名前を使用して、クエリの最後にオプションを追加します。

    したがって、前の例を次のように変更できます。

    USE Music;
    SELECT TOP 3 
      AlbumId,
      AlbumName AS 'Details.Album Name', 
      ReleaseDate AS 'Details.Release Date'
    FROM Albums
    FOR JSON PATH, ROOT('Albums');
    

    結果:

    {
        "Albums": [
            {
                "AlbumId": 1,
                "Details": {
                    "Album Name": "Powerslave",
                    "Release Date": "1984-09-03"
                }
            },
            {
                "AlbumId": 2,
                "Details": {
                    "Album Name": "Powerage",
                    "Release Date": "1978-05-05"
                }
            },
            {
                "AlbumId": 3,
                "Details": {
                    "Album Name": "Singing Down the Lane",
                    "Release Date": "1956-01-01"
                }
            }
        ]
    }
    

    例5–アレイラッパーを削除する

    WITHOUT_ARRAY_WRAPPERを使用できます 結果を囲む角かっこを削除するオプション。

    例:

    USE Music;
    SELECT TOP 1 
      AlbumName, 
      ReleaseDate
    FROM Albums
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
    

    結果:

    {
        "AlbumName": "Powerslave",
        "ReleaseDate": "1984-09-03"
    }
    

    複数行の結果に対してこれを行うと、無効なJSONが発生することに注意してください。


    1. Postgresのヒントとコツ

    2. MongoDBまたは他のドキュメント指向データベースシステムをいつ使用するのですか?

    3. Postgres SELECTの列を連結するにはどうすればよいですか?

    4. MySQLで完全外部結合を行う方法