JSON_VALUE (Transact-SQL)
適用於:SQL Server 2016 (13.x) 和更新版本Azure SQL DatabaseAzure SQL 受控執行個體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 Database 中,您可以提供變數作為 path 的值。
如果 path 的格式無效,則 JSON_VALUE 會傳回錯誤。
傳回值
傳回 nvarchar(4000) 類型的單一文字值。 傳回值的定序與輸入運算式的定序相同。
如果值大於 4000 個字元:
在 lax 模式中,JSON_VALUE 會傳回 Null。
在 strict 模式中,JSON_VALUE 會傳回錯誤。
如果您必須傳回大於 4000 個字元的純量值,請使用 OPENJSON 而不是 JSON_VALUE。 如需詳細資訊,請參閱 OPENJSON (Transact-SQL)。
備註
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')
)
請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應