次の方法で共有


JSON_VALUE(Transact-SQL)

適用対象:Sql Server 2016 (13.x) 以降のバージョンAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric の AzureSQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric のSQL データベース

JSON_VALUE構文は、JSON 文字列からスカラー値を抽出します。

スカラー値ではなく JSON 文字列からオブジェクトまたは配列を抽出するには、 JSON_QUERYを参照してください。 JSON_VALUEJSON_QUERY の違いについては、「JSON_VALUE と JSON_QUERY を比較する」を参照してください。

Transact-SQL 構文表記規則

Syntax

JSON_VALUE ( expression , path [ RETURNING data_type ] )

Arguments

expression

式。 通常、変数または JSON テキストを含む列の名前。

JSON_VALUEパスで識別される値を見つける前に、式で無効な JSON を見つけた場合、関数はエラーを返します。 JSON_VALUEパスで識別される値が見つからない場合は、テキスト全体をスキャンし、のどこにも有効でない JSON が見つかった場合はエラーを返します。

path

抽出するプロパティを指定する JSON のパス。 詳細については、「 SQL データベース エンジンの JSON パス式」を参照してください。

SQL Server 2017 (14.x) と Azure SQL Database では、 パスの値として変数を指定できます。

パスの形式が無効な場合、JSON_VALUEはエラーを返します。

data_type

SQL 型で指定された値を返します。 入力が JSON 型の場合にのみサポートされます。 サポートされている SQL 型は、tinyintsmallintintbigintdecimalnumericfloatrealcharvarcharvarchar(max)ncharnvarchar(max)datetimedatetime2datetimeoffset です。

戻り値

RETURNINGが含まれていない場合:

  • 型 nvarchar (4000) の 1 つのテキスト値を返します。 返される値の照合順序は、入力された式の照合順序と同じです。

  • 値が 4,000 文字を超える場合:

    • lax モードでは、JSON_VALUENULL を返します。
    • 厳格モードでは、JSON_VALUE はエラーを返します。

    4,000 文字を超えるスカラー値を返す必要がある場合は、OPENJSONの代わりにJSON_VALUEを使用します。 詳細については、 OPENJSON を参照してください。

RETURNINGが含まれている場合:

SQL 型で指定された値を返します。 サポートされている SQL 型は、tinyintsmallintintbigintdecimalnumericfloatrealcharvarcharvarchar(max)ncharnvarchar(max)datetimedatetime2datetimeoffset です。

JSON 関数は、JSON ドキュメントが varcharnvarchar、またはネイティブ json データ型のいずれに格納されているかにかかわらず、同じように機能します。

Remarks

厳密でないモードと厳格モード

次の JSON テキストを考えてみます。

DECLARE @jsonInfo AS NVARCHAR (MAX);

SET @jsonInfo = N'{
     "info":{
       "type":1,
       "address":{
         "town":"Bristol",
         "county":"Avon",
         "country/region":"England"
       },
       "tags":["Sport", "Water polo"]
    },
    "type":"Basic"
 }';

次の表は、厳密でないモードと厳格モードでの JSON_VALUE の動作を比較します。 省略可能なパス モードの仕様 (lax または strict) の詳細については、 SQL Database エンジンの JSON パス式を参照してください。

Path 厳密でないモードでの戻り値 厳格モードでの戻り値 詳細情報
$ NULL Error スカラー値ではありません。

代わりに JSON_QUERY を使用してください
$.info.type N'1' N'1' N/a
$.info.address.town N'Bristol' N'Bristol' N/a
$.info."address" NULL Error スカラー値ではありません。

代わりに JSON_QUERY を使用してください
$.info.tags NULL Error スカラー値ではありません。

代わりに JSON_QUERY を使用してください
$.info.type[0] NULL Error 配列ではありません。
$.info.none NULL Error プロパティが存在しません。

Examples

例 1

次の例では、クエリの結果に JSON のプロパティの値 townstate を使用します。 JSON_VALUE がソースの照合順序を保持するため、結果の並べ替え順序が jsonInfo 列の照合順序に依存します。

Note

(この例では、 Person.Person という名前のテーブルに JSON テキストの jsonInfo 列が含まれており、この列には、lax モードと strict モードの説明で既に示した構造があることを前提としています。 AdventureWorks サンプル データベースでは、 Person テーブルには実際には jsonInfo 列が含まれません)。

SELECT FirstName,
       LastName,
       JSON_VALUE(jsonInfo, '$.info.address.town') AS Town
FROM Person.Person
WHERE JSON_VALUE(jsonInfo, '$.info.address.state') LIKE 'US%'
ORDER BY JSON_VALUE(jsonInfo, '$.info.address.town');

例 2

次の例では、ローカル変数に JSON プロパティの値 town を抽出します。

DECLARE @jsonInfo AS NVARCHAR (MAX);
DECLARE @town AS NVARCHAR (32);

SET @jsonInfo = N'{"info":{"address":[{"town":"Paris"},{"town":"London"}]}}';
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[0].town'); -- Paris
SET @town = JSON_VALUE(@jsonInfo, '$.info.address[1].town'); -- London

例 3

次の例では、JSON のプロパティの値に基づいて、計算列を作成します。

CREATE TABLE dbo.Store
(
    StoreID INT IDENTITY (1, 1) NOT NULL,
    Address VARCHAR (500),
    jsonContent NVARCHAR (4000),
    Longitude AS JSON_VALUE(jsonContent, '$.address[0].longitude'),
    Latitude AS JSON_VALUE(jsonContent, '$.address[0].latitude')
);

例 4

次の例では、 JSON_VALUE を使用して JSON 配列から値を抽出し、日付型の値として値を返します。

DECLARE @j AS JSON = '[1, 1.3333, true, "a", "1", "2025-01-01"]';

SELECT JSON_VALUE(@j, '$[5]' RETURNING date) AS date_value;
date_value
--------
2025-01-01