適用於:SQL Server 2016 (13.x) 及以後版本
Azure SQL Database
AzureSQL Managed Instance
Azure Synapse Analytics (僅限 serverless SQL pool )
SQL database in Microsoft Fabric
請使用 JSON 路徑運算式來參考 JSON 物件的屬性。
當您呼叫下列函數時,必須提供路徑運算式。
- 當您呼叫 OPENJSON 以建立 JSON 數據的關係型檢視時。
- 當您呼叫 JSON_VALUE 以從 JSON 文字擷取值時。
- 當您呼叫 JSON_QUERY 以擷取 JSON 物件或陣列時。
- 當您呼叫 JSON_MODIFY 更新 JSON 字串中屬性的值時。
路徑運算式的組成部分
路徑運算式有兩個元件。
路徑模式
在路徑表達式的開頭,選擇性地藉由指定 關鍵詞 lax 或 strict來宣告路徑模式。 預設值為 lax。
在
lax模式中,如果路徑表示式包含錯誤,函式會傳回空白值。 例如,如果您要求 值$.name,且 JSON 文字不包含name索引鍵,則函式會傳回 null,但不會引發錯誤。在
strict模式中,如果路徑表示式包含錯誤,函式就會引發錯誤。
下列查詢會在路徑運算式中明確指定 lax模式。
DECLARE @json AS NVARCHAR (MAX);
SET @json = N'{ ... }';
SELECT *
FROM OPENJSON (@json, N'lax $.info');
Path
選擇性地宣告路徑模式之後,請指定路徑本身。
貨幣符號 (
$) 表示內容項目。屬性路徑是一組路徑步驟。 路徑步驟可包含下列元素和運算子。
關鍵人物。 例如,
$.name與$."first name"。 如果索引鍵名稱以貨幣符號開頭或包含特殊字元 (例如空格或點運算子 (.)),請用引號括住。陣列元素。 例如:
$.product[3]。 以零為基底的陣列。點運算子 (
.) 表示物件的成員。 例如,在$.people[1].surname中,surname是people的子系。如果輸入是 JSON 類型值,也支援數位通配符和範圍搜尋。
陣列通配符和範圍支援
Note
陣列萬用字元與範圍支援目前處於預覽階段,僅在 SQL Server 2025(17.x)中提供。
SQL Server 2025(17.x)擴充了 ANSI SQL/JSON 路徑表達式以支援陣列萬用卡。 Array 通配符可讓您指定所有元素、元素範圍、元素清單或使用特殊符號 'last' 來表示 JSON 陣列中的最後一個值。 SQL/JSON 陣列使用以零起始的索引。 搭配通配符的 SQL/JSON 路徑可用於 JSON_QUERY、 JSON_PATH_EXISTS和 JSON_CONTAINS。
雖然 JSON_VALUE 函式支援 SQL/JSON 路徑表示式,但函式的 JSON_VALUE 傳回值是 SQL 純量,因此函式一律會針對指向 JSON 物件或數位的任何 SQL/JSON 路徑傳回 NULL 。 只有在輸入是 json 類型時,才支援陣列通配符。
下列語法示範如何使用通配符、範圍和特殊令牌 last :
path[elements ]
elements ::= {
*
| number
| number to number
| last
| {number...[, number] }
}
特殊令牌 last 可用於取代數位值。 如果指定範圍,則必須以遞增順序指定範圍。
一些有效的 SQL/JSON 路徑表示式範例:
| Path | Description |
|---|---|
$[*] |
所有元素 |
$[0] |
第一元素 |
$[0 to 2] |
前三個元素 |
$[last] |
最後一個要素 |
$[last, 0] |
Invalid |
$[last, 2, 0, last] |
Invalid |
$.creditcards[0].type |
傳回 creditcards 陣列中第一個元素的類型屬性值。 |
$.credit_cards[*].type |
傳回 creditcards 陣列中所有元素的型別屬性值 |
$.credit_cards[0, 2].type |
傳回creditcards數組中第一個和第三個元素的類型屬性值 |
$.credit_cards[1 to 3].type |
傳回 creditcards 陣列中第二到第四個元素的類型屬性值 |
$.credit_cards[last].type |
傳回陣列 creditcards 最後一個元素之類型屬性值 |
$.credit_cards[last, 0].type |
傳回 creditcards 陣列中第一個和最後一個元素的類型屬性值 |
Examples
本節中的範例參考下列 JSON 文字。
{
"people": [{
"name": "John",
"surname": "Doe"
}, {
"name": "Jane",
"surname": null,
"active": true
}]
}
下表顯示路徑運算式的一些範例。
| 路徑表達式 | Value |
|---|---|
$.people[0].name |
John |
$.people[1] |
{ "name": "Jane", "surname": null, "active": true } |
$.people[1].surname |
NULL |
$ |
{ "people": [ { "name": "John", "surname": "Doe" },{ "name": "Jane", "surname": null, "active": true } ] } |
$.people[last].name |
["Jane"] |
$.people[0 to 1].name |
["John","Jane"] |
$.people[0, 1].name |
["John","Jane"] |
內建函數處理重複路徑的方法
如果 JSON 文字包含重複的屬性 -例如,相同層級上具有相同名稱的兩個索引鍵 - JSON_VALUE 和 函 JSON_QUERY 式只會傳回符合路徑的第一個值。 若要剖析包含重複索引鍵並傳回所有值的 JSON 物件,請使用 OPENJSON,如下列範例所示。
DECLARE @json AS NVARCHAR (MAX);
SET @json = N'{"person":{"info":{"name":"John", "name":"Jack"}}}';
SELECT value
FROM OPENJSON (@json, '$.person.info');
深入瞭解 JSON
如需內建 JSON 支援的視覺效果簡介,請參閱下列影片: