JSON_VALUE (Transact-SQL)
適用於:SQL Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Microsoft Fabric 中的 SQL 分析端點 Microsoft Fabric 中的倉儲
從 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 Database 中,您可以提供變數作為 path 的值。
如果 path 的格式無效,則 JSON_VALUE
會傳回錯誤。
傳回值
傳回 nvarchar(4000) 類型的單一文字值。 傳回值的定序與輸入運算式的定序相同。
如果值大於 4000 個字元:
在 lax 模式中,
JSON_VALUE
會傳回NULL
。在 strict 模式中,
JSON_VALUE
會傳回錯誤。
如果您必須傳回大於 4000 個字元的純量值,請使用 OPENJSON
而非 JSON_VALUE
。 如需詳細資訊,請參閱 OPENJSON (Transact-SQL)。
無論 JSON 文件是以 varchar、nvarchar 或原生 json 資料類型儲存,JSON 函數的運作方式皆相同。
備註
lax 模式和 strict 模式
請參考下列 JSON 文字:
DECLARE @jsonInfo NVARCHAR(MAX)
SET @jsonInfo=N'{
"info":{
"type":1,
"address":{
"town":"Bristol",
"county":"Avon",
"country":"England"
},
"tags":["Sport", "Water polo"]
},
"type":"Basic"
}'
下列表格會比較 lax 模式與 strict 模式中 JSON_VALUE
的行為。 如需選擇性路徑模式規格 (lax 或 strict) 的詳細資訊,請參閱 JSON 路徑運算式 (SQL Server)。
Path | lax 模式中的傳回值 | strict 模式中的傳回值 | 其他資訊 |
---|---|---|---|
$ | NULL |
錯誤 | 非純量值。 請改用 JSON_QUERY 。 |
$.info.type | N'1' | N'1' | N/a |
$.info.address.town | N'Bristol' | N'Bristol' | N/a |
$.info."address" | NULL |
錯誤 | 非純量值。 請改用 JSON_QUERY 。 |
$.info.tags | NULL |
錯誤 | 非純量值。 請改用 JSON_QUERY 。 |
$.info.type[0] | NULL |
錯誤 | 非陣列。 |
$.info.none | NULL |
錯誤 | 屬性不存在。 |
範例
範例 1
下列範例會使用查詢結果中 town
和 state
的 JSON 屬性值。 由於 JSON_VALUE
會保留來源的定序,因此結果的排序次序取決於 jsonInfo
資料行定序而定。
注意
(這個範例假設一個名為 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 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')
)