JSON_VALUE (Transact-SQL)

適用対象: SQL Server 2016 (13.x) 以降 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics

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

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

Transact-SQL 構文表記規則

構文

JSON_VALUE ( expression , path )  

引数

式 (expression)

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

JSON_VALUE が、path によって識別される値を検出する前に expression で無効な JSON を検出した場合、関数はエラーを返します。 JSON_VALUEpath によって識別される値を検出できない場合、テキスト全体がスキャンされ、expression のどこかで無効な JSON を検出した場合はエラーを返します。

path

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

SQL Server 2017 (14.x) と Azure SQL データベース では、path の値として変数を指定できます。

path の書式が有効でない場合、JSON_VALUE からエラーが返されます。

戻り値

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

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

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

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

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

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

解説

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

次の 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 の動作を比較します。 省略可能なパス モード (厳密でない、または厳格) の指定について詳しくは、「JSON パス式 (SQL Server)」を参照してください。

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

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

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

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

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

例 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

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