1. 程式人生 > 資料庫 >MySQL資料型別 - JSON資料型別 (3)

MySQL資料型別 - JSON資料型別 (3)

最右邊的陣列元素。MySQL支援last關鍵字,作為陣列中最後一個元素的索引的同義詞。last - N 形式的表示式可用於相對定址和範圍定義,如下所示:
MySQL資料型別 - JSON資料型別 (3)

如果不是針對陣列計算路徑,則求值結果與將該值包裝在單個元素陣列中的結果相同:

MySQL資料型別 - JSON資料型別 (3)

可以使用帶有JSON列識別符號和JSON路徑表示式 column->path 的形式,用作JSON_EXTRACT(column, path)的同義詞。

有些函式獲取現有的JSON文件,以某種方式對其進行修改,然後返回修改後的文件。路徑表示式指示文件中要進行更改的位置。例如,JSON_SET()、JSON_INSERT()和JSON_REPLACE()函式都接受一個JSON文件,外加一個或多個成對兒的路徑值,這些路徑值描述了在何處修改文件以及要改成什麼值。這些函式在處理文件中現有值和不存在值的方式上有所不同。

考慮一下這個檔案:

MySQL資料型別 - JSON資料型別 (3)

JSON_SET()替換已存在路徑的值,併為不存在的路徑新增值:

MySQL資料型別 - JSON資料型別 (3)

在本例中,路徑$[1].b[0]選擇一個現有值(true),該值將替換為路徑引數(1)後面的值。路徑$[2][2]不存在,因此相應的值(2)將新增到由$[2]選擇的值中。

JSON_INSERT()新增新值,但不替換現有值:
MySQL資料型別 - JSON資料型別 (3)

JSON_REPLACE() 替換現有值並忽略新值:

MySQL資料型別 - JSON資料型別 (3)
成對兒路徑值從左到右計算。通過計算一對兒路徑值生成文件,這個文件又成為下一對路徑值計算的基礎。

JSON_REMOVE()接受一個JSON文件和一個或多個指定要從文件中刪除的值的路徑。返回值為原始文件減去文件中存在的路徑選擇的值:

MySQL資料型別 - JSON資料型別 (3)

路徑具有以下效果:

●$[2]匹配[10,20]並將其刪除。

●$[1].b[1]的第一個例項在b元素中匹配false並將其刪除。

●$[1].b[1]的第二個例項與任何內容都不匹配:該元素已被刪除,路徑不再存在,所以不起作用。

JSON路徑語法

MySQL支援的許多JSON函式需要一個路徑表示式來標識JSON文件中的特定元素。路徑由路徑的範圍和一個或多個路徑分支組成。對於MySQL JSON函式中使用的路徑,範圍始終是要搜尋或以其他方式操作的文件,用前導的$字元表示。路徑分支由句點字元(.)分隔。陣列中的成員用[N]表示,其中N是非負整數。鍵的名稱必須是帶有雙引號的字串或有效的ECMAScript識別符號(請參閱ECMAScript語言規範中的識別符號名稱和識別符號)。路徑表示式,就像JSON文字,應使用ascii、utf8或utf8mb4字符集進行編碼。其他字元編碼被隱式強制為utf8mb4。完整的語法如下所示:

MySQL資料型別 - JSON資料型別 (3)

如前所述,在MySQL中,路徑的範圍一直是被操作的文件,用$表示。可以在JSON路徑表示式中將'$'當作文件的同義詞。

萬用字元 * 和 **標記的用法如下:

●. * 表示物件中所有成員的值。

●[ * ] 表示陣列中所有成員的值。

●[prefix]suffix表示以prefix開頭、以suffix結尾的所有路徑。prefix是可選的,suffix是必需的;換句話說,路徑不能以結尾。

另外,路徑不能包含序列***。

有關路徑語法示例,請參考將路徑作為引數的各種JSON函式的說明,例如JSON_CONTAINS_PATH()、JSON_SET()和JSON_REPLACE()。有關使用*和**萬用字元的示例,請參閱JSON_SEARCH()函式的說明。

MySQL 8.0.2及更高版本還支援JSON陣列使用 to 關鍵字獲得子集(例如 $[2 to 10]),last關鍵字作為陣列最右邊元素同義詞這些範圍表示法。

官方文件地址: