JSON_QUERY (Transact-SQL)
適用於:SQL Server 2016 (13.x) 和更新版本的 Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics
從 JSON 字串擷取物件或陣列。
若要從 JSON 字串而非物件或陣列擷取純量值,請參閱 JSON_VALUE (Transact-SQL)。 如需 JSON_VALUE 及 JSON_QUERY
之間的差異資訊,請參閱比較 JSON_VALUE 與 JSON_QUERY。
語法
JSON_QUERY ( expression [ , path ] )
引數
expression
運算式。 通常為變數的名稱或包含 JSON 文字的資料行。
若 JSON_QUERY
在找到 path 識別的值之前找到在 expression 中無效的 JSON,函數便會傳回錯誤。 若 JSON_QUERY
找不到 path 識別的值,它會掃描整個文字,並在 expression 中任何一處找到無效的 JSON 時傳回錯誤。
path
指定要擷取之物件或陣列的 JSON 路徑。
在 SQL Server 2017 (14.x) 和 Azure SQL Database 中,您可以提供變數作為 path 的值。
JSON 路徑可為剖析指定 lax 或 strict 模式。 若您未指定剖析模式,預設會使用 lax 模式。 如需詳細資訊,請參閱 JSON 路徑運算式 (SQL Server)。
path 的預設值為 '$'。 如此一來,若您未提供 path 的值,JSON_QUERY
會傳回輸入的 expression。
如果 path 的格式無效,則 JSON_QUERY
會傳回錯誤。
傳回值
傳回類型為 nvarchar(max) 的 JSON 片段。 傳回值的定序與輸入運算式的定序相同。
若值並非物件或陣列:
在 lax 模式中,
JSON_QUERY
會傳回 Null。在 strict 模式中,
JSON_QUERY
會傳回錯誤。
備註
lax 模式和 strict 模式
請參考下列 JSON 文字:
{
"info": {
"type": 1,
"address": {
"town": "Cheltenham",
"county": "Gloucestershire",
"country": "England"
},
"tags": ["Sport", "Water polo"]
},
"type": "Basic"
}
下列表格會比較 lax 模式與 strict 模式中 JSON_QUERY
的行為。 如需選擇性路徑模式規格 (lax 或 strict) 的詳細資訊,請參閱 JSON 路徑運算式 (SQL Server)。
Path | lax 模式中的傳回值 | strict 模式中的傳回值 | 其他資訊 |
---|---|---|---|
$ | 傳回完整的 JSON 文字。 | 傳回完整的 JSON 文字。 | N/a |
$.info.type | NULL | 錯誤 | 並非物件或陣列。 請改為使用 JSON_VALUE。 |
$.info.address.town | NULL | 錯誤 | 並非物件或陣列。 請改為使用 JSON_VALUE。 |
$.info."address" | N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' | N'{ "town":"Cheltenham", "county":"Gloucestershire", "country":"England" }' | N/a |
$.info.tags | N'[ "Sport", "Water polo"]' | N'[ "Sport", "Water polo"]' | N/a |
$.info.type[0] | NULL | 錯誤 | 非陣列。 |
$.info.none | NULL | 錯誤 | 屬性不存在。 |
搭配 FOR JSON 使用 JSON_QUERY
JSON_QUERY
會傳回有效的 JSON 片段。 因此,FOR JSON 不會在 JSON_QUERY
的傳回值中逸出特殊字元。
若您使用 FOR JSON 傳回結果,並且在其中包含已經是 JSON 格式的資料 (在資料行中或運算式的結果),請使用不具有 path 參數的 JSON_QUERY
來包裝 JSON 資料。
範例
範例 1
下列範例示範如何在查詢結果中傳回來自 CustomFields
資料行的 JSON 片段。
SELECT PersonID,FullName,
JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People
範例 2
下列範例示範如何在 FOR JSON 子句的輸出中包含 JSON 片段。
SELECT StockItemID, StockItemName,
JSON_QUERY(Tags) as Tags,
JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH