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

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

    SQL ServerでJSONを使用する場合は、JSON_VALUE()を使用できます。 JSON文字列からスカラー値を返す関数。

    この関数を使用するには、2つの引数を指定します。 JSON式、および抽出するプロパティ。

    構文

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

    JSON_VALUE ( expression , path )
    

    expressionの場所 はJSON文字列式であり、path その式から抽出するプロパティです。

    path引数には、オプションのパスモードを含めることができます。 成分。このオプションのパスモードは、laxのいずれかの値にすることができます またはstrict 。この値がある場合は、ドル記号の前に表示されます。

    例1-基本的な使用法

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

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

    結果:

    +----------+
    | Result   |
    |----------|
    | Bruce    |
    +----------+
    

    この例では:

    • {"Name": "Bruce"} 引数はJSON式です(小さいものですが、それでも有効なJSON式です)。 JSON式は、キーと値のペアで構成されます。この場合、Name キーは、Bruce その価値です。
    • $.Name 引数はパスです。このパスは、Nameの値を参照します JSON式のキー。したがって、ペアの名前を参照することで値を抽出できます。

    例2–アレイ

    配列から値を抽出するには、角括弧内のインデックスを参照し、その後に関連するキーを続けます。次に例を示します:

    /* 
    CREATE THE ARRAY (and put into a variable called @data)
    */
    DECLARE @data NVARCHAR(4000)
    SET @data=N'{
        "Cities": [
            {
                "Name": "Kabul",
                "CountryCode": "AFG",
                "District": "Kabol",
                "Population": 1780000
            },
            {
                "Name": "Qandahar",
                "CountryCode": "AFG",
                "District": "Qandahar",
                "Population": 237500
            }
        ]
    }'
    
    /* 
    QUERY THE ARRAY
    */
    SELECT 
      JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name',
      JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code',
      JSON_VALUE(@data,'$.Cities[0].District') AS 'District',
      JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population'
    
    UNION ALL
    
    SELECT 
      JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name',
      JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code',
      JSON_VALUE(@data,'$.Cities[1].District') AS 'District',
      JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';  
    

    結果:

    +----------+----------------+------------+--------------+
    | Name     | Country Code   | District   | Population   |
    |----------+----------------+------------+--------------|
    | Kabul    | AFG            | Kabol      | 1780000      |
    | Qandahar | AFG            | Qandahar   | 237500       |
    +----------+----------------+------------+--------------+
    

    したがって、この例では、JSON配列を作成し、それを@dataという変数に入れます。 。次に、@dataを使用してクエリを実行します JSON_VALUE()の最初の引数として 関数(これは@dataが原因です JSON式が含まれています)。

    配列はゼロベースの番号付けを使用するため、最初の項目を抽出するには、Cities[0]を使用する必要があります。 、2番目のCities[1] 、など。

    例3–データベースの例

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

    SELECT 
      JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name',
      JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code',
      JSON_VALUE(Document,'$.Cities[0].District') AS 'District',
      JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population'
    FROM Json_Documents
    
    UNION ALL
    
    SELECT 
      JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name',
      JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code',
      JSON_VALUE(Document,'$.Cities[1].District') AS 'District',
      JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population'
    FROM Json_Documents
    

    結果:

    +----------+----------------+------------+--------------+
    | Name     | Country Code   | District   | Population   |
    |----------+----------------+------------+--------------|
    | Kabul    | AFG            | Kabol      | 1780000      |
    | Qandahar | AFG            | Qandahar   | 237500       |
    +----------+----------------+------------+--------------+
    

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

    例4–パスモード

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

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

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

    デフォルト値はlaxです 。

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

    緩いモードでのエラー

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

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

    結果:

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

    この例では、Hobbiesを参照しようとしています。 、ただし、そのキーはJSONドキュメントに存在しません。この場合、null値を取得します(緩いモードを使用しているため)。

    厳密モードでのエラー

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

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

    結果:

    Msg 13608, Level 16, State 1, Line 1
    Property cannot be found on the specified JSON path.
    

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

    例5–オブジェクトと配列を返す

    JSON_VALUE() 関数はオブジェクトと配列を返しません。オブジェクトまたは配列を返す場合は、JSON_QUERY()を使用します 代わりに機能します。クエリ内で両方の関数を使用する例を次に示します。

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

    結果:

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

    この場合、JSON_VALUE()を使用します さまざまなスカラー値を返すには、JSON_QUERY() 配列を返します。

    したがって、オブジェクトまたは配列(JSONドキュメント全体を含む)を返す必要がある場合は、JSON_QUERY()を参照してください。 SQLServerの例。


    1. LINQで全文検索(FTS)を使用することは可能ですか?

    2. COUNT(rowid)はCOUNT(*)よりも高速ですか?

    3. PostgreSQLで年齢を年単位で計算する

    4. アソシエーションテーブルの正しい名前は何ですか(多対多の関係)