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

JSON_QUERY()SQL Server(T-SQL)の例

    SQL ServerでJSONを使用する場合は、JSON_QUERY()を使用できます。 JSON文字列からオブジェクトまたは配列を抽出する関数。

    この関数を使用するには、JSON式を引数として指定します。抽出するオブジェクトまたは配列を指定するための2番目の(オプションの)引数を指定することもできます。

    構文

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

    JSON_QUERY ( expression [ , path ] )  
    

    expressionの場所 はJSON文字列式であり、path その式から抽出するオブジェクトまたは配列です。 path 引数はオプションです(指定しない場合は、JSONドキュメント全体が返されます)。

    パス引数(指定されている場合)には、オプションのパスモードを含めることができます。 成分。このオプションのパスモードは、laxのいずれかの値にすることができます またはstrict 。この値は、指定されたパスが無効な場合に何が発生するかを決定します。パスモード(指定されている場合)はドル記号の前にあります。

    例1-基本的な使用法

    JSON_QUERY()の基本的な使用法を示す例を次に示します。 機能。

    DECLARE @data NVARCHAR(4000)
    SET @data=N'{
        "Cities": [
            {
                "Name": "Kabul",
                "CountryCode": "AFG",
                "District": "Kabol",
                "Population": 1780000
            },
            {
                "Name": "Qandahar",
                "CountryCode": "AFG",
                "District": "Qandahar",
                "Population": 237500
            }
        ]
    }'
    SELECT JSON_QUERY(@data, '$.Cities[0]') AS 'Result';
    

    結果:

    +----------+
    | Result   |
    |----------|
    | {
                "Name": "Kabul",
                "CountryCode": "AFG",
                "District": "Kabol",
                "Population": 1780000
            }          |
    +----------+
    

    この例では、最初に@dataという変数を宣言して設定します。 。次に、この変数に配列を割り当てます。これを行ったら、その配列に対してクエリを実行します。

    この場合、Cities[0]を使用します 配列の最初の項目を参照します(JSON配列はゼロベースの番号付けを使用します)。

    Cities[1]を使用して2番目のアイテムにアクセスできました 。このように:

    DECLARE @data NVARCHAR(4000)
    SET @data=N'{
        "Cities": [
            {
                "Name": "Kabul",
                "CountryCode": "AFG",
                "District": "Kabol",
                "Population": 1780000
            },
            {
                "Name": "Qandahar",
                "CountryCode": "AFG",
                "District": "Qandahar",
                "Population": 237500
            }
        ]
    }'
    SELECT JSON_QUERY(@data, '$.Cities[1]') AS 'Result';
    

    結果:

    +----------+
    | Result   |
    |----------|
    | {
                "Name": "Qandahar",
                "CountryCode": "AFG",
                "District": "Qandahar",
                "Population": 237500
            }          |
    +----------+
    

    例2–JSON式全体を返す

    2番目の引数はオプションであるため、これを省略すると、JSONドキュメント全体が返されます。前の例と同じデータを使用してこれを行うと、次のようになります。

    DECLARE @data NVARCHAR(4000)
    SET @data=N'{
        "Cities": [
            {
                "Name": "Kabul",
                "CountryCode": "AFG",
                "District": "Kabol",
                "Population": 1780000
            },
            {
                "Name": "Qandahar",
                "CountryCode": "AFG",
                "District": "Qandahar",
                "Population": 237500
            }
        ]
    }'
    SELECT JSON_QUERY(@data) AS 'Result';
    

    結果:

    +----------+
    | Result   |
    |----------|
    | {
        "Cities": [
            {
                "Name": "Kabul",
                "CountryCode": "AFG",
                "District": "Kabol",
                "Population": 1780000
            },
            {
                "Name": "Qandahar",
                "CountryCode": "AFG",
                "District": "Qandahar",
                "Population": 237500
            }
        ]
    }          |
    +----------+
    

    例3–データベースの例

    前の例のデータをデータベースに入れる場合、クエリを次のように書き直すことができます。

    SELECT 
      JSON_QUERY(Document,'$.Cities[0]') AS 'City 1'
    FROM Json_Documents
    

    結果:

    +----------+
    | City 1   |
    |----------|
    | {
                "ID": 1,
                "Name": "Kabul",
                "CountryCode": "AFG",
                "District": "Kabol",
                "Population": 1780000
            }          |
    +----------+
    

    これは、JSONドキュメントがDocumentという列に保存されていることを前提としています。 、Json_Documentsというテーブルにあります 。

    例4–スカラー値

    JSON_QUERY() 関数はスカラー値を返すようには設計されていません。スカラー値を返したい場合は、JSON_VALUE()を使用してください 代わりに機能します。

    ただし、クエリ内で両方の関数を組み合わせて、さまざまなレベルの粒度でデータを返すことを妨げるものは何もありません。

    次に例を示します:

    DECLARE @data NVARCHAR(4000)
    SET @data=N'{  
        "Suspect": {    
           "Name": "Homer Simpson",
           "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
        }
     }'
     SELECT 
       JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
       JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
       JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
    

    結果:

    +---------------+----------------------------------------+--------------+
    | Name          | Hobbies                                | Last Hobby   |
    |---------------+----------------------------------------+--------------|
    | Homer Simpson | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping |
    +---------------+----------------------------------------+--------------+
    

    この例では、JSON_VALUE()を使用しました さまざまなスカラー値を抽出するために使用しましたが、JSON_QUERY()も使用しました 配列全体を返します(JSON_VALUE() できません)。

    例5–パスモード

    前述のように、パスモードを指定するオプションもあります。これはlaxのいずれかです。 またはstrict

    パスモードの値は、パス式にエラーが含まれている場合に何が起こるかを決定します。具体的には:

    • 緩い モードでは、パス式にエラーが含まれている場合、関数は空の値を返します。たとえば、値$。nameをリクエストした場合 、およびJSONテキストに名前が含まれていない キーを押すと、関数はnullを返しますが、エラーは発生しません。
    • 厳格 モードの場合、パス式にエラーが含まれていると、関数はエラーを発生させます。

    デフォルト値はlaxです 。

    これら2つのモードの違いを示す例を次に示します。

    緩いモードでのエラー

    緩いモードでパス式にエラーが含まれていると、次のようになります。

    SELECT JSON_QUERY('{"Name": "Bruce"}', 'lax $.Name') AS 'Result';
    

    結果:

    +----------+
    | Result   |
    |----------|
    | NULL     |
    +----------+
    

    この例では、スカラー値を返そうとしていますが、JSON_QUERY() スカラー値は実行しません。前述のように、オブジェクトと配列のみを返します。この場合、null値を取得します(緩いモードを使用しているため)。

    厳密モードでのエラー

    同じコードを厳密モードで実行すると、次のようになります。

    SELECT JSON_QUERY('{"Name": "Bruce"}', 'strict $.Name') AS 'Result';
    

    結果:

    Msg 13624, Level 16, State 2, Line 1
    Object or array cannot be found in the specified JSON path.
    

    予想どおり、厳密モードではエラーを説明するエラーメッセージが表示されます。


    1. EntityFramework6トランザクションのロールバック

    2. SQLServerの論理OR演算子とは-SQLServer/TSQLチュートリアルパート119

    3. サーバーはホストlocalhost(::1)で実行されており、ポート5432でTCP / IP接続を受け入れていますか?

    4. プリペアドステートメントを使用したMySQLのLIMITキーワード