適用対象:SQL Server 2016 (13.x) 以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft Fabric 内の SQL 分析エンドポイント
Microsoft Fabric におけるウェアハウス
Microsoft Fabric プレビュー内の SQL データベース
JSON_VALUE
構文は、JSON 文字列からスカラー値を抽出します。
スカラー値ではなく JSON 文字列からオブジェクトまたは配列を抽出するには、「 JSON_QUERY (Transact-SQL)」を参照してください。
JSON_VALUE
と JSON_QUERY
の違いについては、「JSON_VALUE と JSON_QUERY を比較する」を参照してください。
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_VALUE
はNULL
を返します。厳格モードでは、
JSON_VALUE
はエラーを返します。
4,000 文字を超えるスカラー値を返す必要がある場合は、OPENJSON
の代わりにJSON_VALUE
を使用します。 詳細については、 OPENJSON (Transact-SQL) を参照してください。
JSON 関数は、JSON ドキュメントが varchar、 nvarchar、またはネイティブ 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 のプロパティの値 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')
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')
)