次の方法で共有


JSON_VALUE (Transact-SQL)

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

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

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

Transact-SQL 構文表記規則

Syntax

JSON_VALUE ( expression , path )  

Arguments

expression

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

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

path

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

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

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

Return value

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

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

  • lax モードでは、JSON_VALUENULL を返します。

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

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

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

Remarks

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

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

DECLARE @jsonInfo NVARCHAR(MAX)

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

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

Path 厳密でないモードでの戻り値 厳格モードでの戻り値 More info
$ 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

Example 1

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

Note

(この例では、Person.Person という名前のテーブルが JSON テキストの jsonInfo 列を含み、またこの列が、前の厳密でないモードと厳格モードの説明で示した構造を持っていることを前提としています。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')

Example 2

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

DECLARE @jsonInfo NVARCHAR(MAX)
DECLARE @town 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

Example 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')
 )