適用対象:Sql Server 2016 (13.x) 以降のバージョン
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft Fabric の AzureSQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric のSQL データベース
JSON_VALUE構文は、JSON 文字列からスカラー値を抽出します。
スカラー値ではなく JSON 文字列からオブジェクトまたは配列を抽出するには、 JSON_QUERYを参照してください。
JSON_VALUE と JSON_QUERY の違いについては、「JSON_VALUE と JSON_QUERY を比較する」を参照してください。
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 型は、tinyint、smallint、int、bigint、decimal、numeric、float、real、char、varchar、varchar(max)、nchar、nvarchar(max)、date、time、datetime2、datetimeoffset です。
戻り値
RETURNINGが含まれていない場合:
型 nvarchar (4000) の 1 つのテキスト値を返します。 返される値の照合順序は、入力された式の照合順序と同じです。
値が 4,000 文字を超える場合:
- lax モードでは、
JSON_VALUEはNULLを返します。 - 厳格モードでは、
JSON_VALUEはエラーを返します。
4,000 文字を超えるスカラー値を返す必要がある場合は、
OPENJSONの代わりにJSON_VALUEを使用します。 詳細については、 OPENJSON を参照してください。- lax モードでは、
RETURNINGが含まれている場合:
SQL 型で指定された値を返します。 サポートされている SQL 型は、tinyint、smallint、int、bigint、decimal、numeric、float、real、char、varchar、varchar(max)、nchar、nvarchar(max)、date、time、datetime2、datetimeoffset です。
JSON 関数は、JSON ドキュメントが varchar、 nvarchar、またはネイティブ 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 のプロパティの値 town と state を使用します。
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