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_VALUE
と JSON_QUERY
の違いについては、「JSON_VALUE と JSON_QUERY を比較する」を参照してください。
構文
JSON_VALUE ( expression , path )
引数
式 (expression)
式。 通常、変数または JSON テキストを含む列の名前。
JSON_VALUE
が、path によって識別される値を検出する前に expression で無効な JSON を検出した場合、関数はエラーを返します。 JSON_VALUE
が path によって識別される値を検出できない場合、テキスト全体がスキャンされ、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_VALUE
はNULL
を返します。厳格モードでは、
JSON_VALUE
はエラーを返します。
4,000 文字を超えるスカラー値を返す必要がある場合は、JSON_VALUE
の代わりにOPENJSON
を使用します。 詳細については、「OPENJSON (Transact-SQL)」をご覧ください。
JSON 関数は、JSON ドキュメントが varchar、nvarchar またはネイティブ 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 のプロパティの値 town
と state
を使用します。 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')
)