輕松上手MYSQL之JSON函數(shù)實(shí)現(xiàn)高效數(shù)據(jù)查詢與操作
一、JSON_EXTRACT 提取指定數(shù)據(jù)
MySQL JSON_EXTRACT() 函數(shù)在 JSON 文檔提取路徑表達(dá)式指定的數(shù)據(jù)并返回。
語(yǔ)法:
JSON_EXTRACT(json, path, ...)
參數(shù)說明:
- json:必需的。一個(gè) JSON 文檔。
- path:必需的。至少指定一個(gè)路徑表達(dá)式。
返回值:
- 返回 JSON 文檔中由路徑表達(dá)式匹配的所有的值。
- 返回NULL情況:
- 不存在指定的路徑。
- 任意一個(gè)參數(shù)為
NULL。
- 報(bào)錯(cuò)情況:
json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式。
示例:
SELECT JSON_EXTRACT('[1, 2, {"x": 3}]', '$[1]'); // 2
SELECT JSON_EXTRACT('[1, 2, {"x": 3}]', '$[2]'); // {"x": 3}二、JSON_UNQUOTE 取消雙引號(hào)
MySQL JSON_UNQUOTE() 函數(shù)取消雙引號(hào)引用 JSON 值,并將結(jié)果作為字符串返回。
語(yǔ)法:
JSON_UNQUOTE(json_val)
參數(shù)說明:
json_val:必需的。一個(gè)字符串。
返回值:
- 取消雙引號(hào)引用 JSON 值
- 返回NULL情況:參數(shù)為
NULL。 報(bào)錯(cuò)情況:不是有效的 JSON 字符串文本。能夠識(shí)別下表中的轉(zhuǎn)義字符:- \":雙引號(hào)
" \b:退格字符\f:換頁(yè)符\n:換行符\r:回車符\t:制表符\\:反斜杠 \\uXXXX:Unicode 值 XXXX 的 UTF-8 字節(jié)
- \":雙引號(hào)
示例:
SELECT JSON_UNQUOTE('"123456"'); // 123456
SELECT JSON_UNQUOTE(CAST('"cxian"' AS JSON)); // cxian三、JSON_KEYS 取成員的數(shù)組
MySQL JSON_KEYS() 函數(shù)返回一個(gè)包含了指定的 JSON 對(duì)象中最上層的成員 (key) 的數(shù)組。
語(yǔ)法:
JSON_KEYS(json) JSON_KEYS(json, path)
參數(shù)說明:
json:必需的。一個(gè) JSON 對(duì)象文檔。path:可選的。路徑表達(dá)式。
返回值:
- 返回一個(gè)包含了指定的 JSON 對(duì)象中最上層的成員 (key) 的數(shù)組。
- 若指定了路徑表達(dá)式,則返回路徑表達(dá)式匹配的 JSON 對(duì)象中的最上層的成員組成的數(shù)組。
- 返回
NULL情況:- 無路徑,JSON 文檔不是一個(gè) JSON 對(duì)象。
- 有路徑,路徑匹配的 JSON 值不是 JSON 對(duì)象。
- 任意參數(shù)為
NULL。
- 報(bào)錯(cuò)情況:
-
json不是有效的 JSON 文檔。 path不是有效的路徑表達(dá)式。
-
示例:
SELECT JSON_KEYS('{"a": 1, "b": 2, "c": 3}'); // ["a", "b", "c"]
SELECT JSON_KEYS('[1, {"a": 1, "b": 2, "c": 3}]', '$[1]'); // ["a", "b", "c"]
SELECT
JSON_KEYS('1'), // null
JSON_KEYS('"true"'), // null
JSON_KEYS('"abc"'), // null
JSON_KEYS('[0, 1]'); // null
四、JSON_ARRAY 將參數(shù)轉(zhuǎn)為數(shù)組
MySQL JSON_ARRAY() 函數(shù)返回一個(gè)包含了所有參數(shù)的 JSON 數(shù)組。
語(yǔ)法:
JSON_ARRAY(value1[, value2[, ...]])
參數(shù)說明:
value1[, value2[, ...]]:可選的。一些值,他們將被放在 JSON 數(shù)組中。
返回值:
- 包含了所有參數(shù)的 JSON 數(shù)組。
- 值轉(zhuǎn)換情況:
- TRUE 被轉(zhuǎn)換為 true
- FALSE 被轉(zhuǎn)換為 false
- NULL 被轉(zhuǎn)換為 null
- 日期,時(shí)間,日期時(shí)間 被轉(zhuǎn)換為 字符串
示例:
SELECT JSON_ARRAY(1, '1', NULL, TRUE, FALSE, NOW()); // [1, "1", null, true, false, "2023-11-05 16:58:34.000000"]
SELECT JSON_ARRAY(JSON_ARRAY(1, 2), JSON_ARRAY('a', 'b')); // [[1, 2], ["a", "b"]]五、JSON_OBJECT 參數(shù)轉(zhuǎn)為對(duì)象
MySQL JSON_OBJECT() 函數(shù)返回一個(gè)包含了由參數(shù)指定的所有鍵值對(duì)的 JSON 對(duì)象。
語(yǔ)法:
JSON_OBJECT(key, value[, key2, value2, ...])
參數(shù)說明:
- key:必需的。對(duì)象中的鍵。
- value:必需的。對(duì)象中的 key 的值。
返回值:
- 一個(gè)包含了所有鍵值對(duì)的 JSON 對(duì)象。
- 報(bào)錯(cuò)情況:
key是NULL。- 奇數(shù)個(gè)參數(shù)。
示例:
SELECT JSON_OBJECT('name', 'cxian', 'age', 22); // {"age": 22, "name": "cxian"}
SELECT JSON_OBJECT('name', 'cxian', 'age', 22, 'age', 33); // {"age": 33, "name": "cxian"}
六、JSON_DEPTH 取JSON深度
MySQL JSON_DEPTH() 函數(shù)返回一個(gè) JSON 文檔的最大深度。
語(yǔ)法:
JSON_DEPTH(json)
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。
返回值:
- 一個(gè) JSON 文檔的最大深度。規(guī)則如下:
- 空的數(shù)組、空的對(duì)象或者純值的深度是 1。
- 僅包含深度為 1 的元素的數(shù)組的深度是 2。
- 所有成員的值的深度為 1 的對(duì)象的深度是 2。
- 其他 JSON 文檔的深度都大于 2。
- 返回
NULL情況:參數(shù)為NULL。 報(bào)錯(cuò)情況:參數(shù)不是有效的 JSON 文檔。
示例:
SELECT
JSON_DEPTH('[]'), // 1
JSON_DEPTH('[1, 2]'), // 2
JSON_DEPTH('[1, [2, 3]]'); // 3七、JSON_LENGTH 取節(jié)點(diǎn)長(zhǎng)度
MySQL JSON_LENGTH() 函數(shù)返回 JSON 文檔或者 JSON 文檔中通過路徑指定的節(jié)點(diǎn)的長(zhǎng)度。
語(yǔ)法:
JSON_LENGTH(json) JSON_LENGTH(json, path)
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。path:可選的。一個(gè)路徑表達(dá)式。
返回值:
- 有path: 返回 JSON 文檔中由路徑指定的值的長(zhǎng)度。
- 無path:返回 JSON 文檔的長(zhǎng)度。
- 計(jì)算 JSON 文檔的長(zhǎng)度規(guī)則:
- 純值的長(zhǎng)度是 1。
- 數(shù)組的長(zhǎng)度是數(shù)組元素的數(shù)量。
- 對(duì)象的長(zhǎng)度是對(duì)象成員的數(shù)量。
- 內(nèi)嵌的數(shù)組或?qū)ο蟛粎⑴c計(jì)算長(zhǎng)度。
- 返回
NULL情況:- 不存在指定的路徑。
- 任意一個(gè)參數(shù)為
NULL。
- 報(bào)錯(cuò)情況:
json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式。path中包含*或**。
示例:
SELECT
JSON_LENGTH('1'), // 1
JSON_LENGTH('true'), // 1
JSON_LENGTH('false'), // 1
JSON_LENGTH('null'), // 1
JSON_LENGTH('"a"'); // 1
JSON_LENGTH('[]'), // 0
JSON_LENGTH('[1, 2]'), // 2
JSON_LENGTH('[1, {"x": 2}]'); // 2八、JSON_CONTAINS 判斷是否包含
MySQL JSON_CONTAINS() 函數(shù)檢查一個(gè) JSON 文檔中是否包含另一個(gè) JSON 文檔。
語(yǔ)法:
JSON_CONTAINS(target_json, candidate_json) JSON_CONTAINS(target_json, candidate_json, path)
參數(shù)說明:
target_json必需的。一個(gè) JSON 文檔。candidate_json:必需的。被包含的 JSON 文檔。path:可選的。一個(gè)路徑表達(dá)式。
返回值:
- 包含:返回1。
- 不包含:返回0。
- 返回
NULL情況:- JSON 文檔中不存在指定的路徑。
- 任意一個(gè)參數(shù)為
NULL。
- 報(bào)錯(cuò)情況:
json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式。
示例:
SELECT
JSON_CONTAINS('[1, 2, {"x": 3}]', '1'), // 1
JSON_CONTAINS('[1, 2, {"x": 3}]', '{"x": 3}'), // 1
JSON_CONTAINS('[1, 2, {"x": 3}]', '3'), // 0
JSON_CONTAINS('[1, 2, [3, 4]]', '2'), // 1
JSON_CONTAINS('[1, 2, [3, 4]]', '2', '$[2]'); // 0
九、JSON_ARRAY_APPEND 追加值
MySQL JSON_ARRAY_APPEND() 函數(shù)向 JSON 文檔中的指定的數(shù)組中追加一個(gè)值并返回修改后的 JSON 文檔。
語(yǔ)法:
JSON_ARRAY_APPEND(json, path, value[, path2, value2] ...)
參數(shù)說明:
json:必需的。被修改的 JSON 文檔。path:必需的。添加新元素的路徑。一個(gè)有效的路徑表達(dá)式,它不能包含*或**。value:必需的。被添加到數(shù)組的新元素值。
返回值:
- 追加后的 JSON 文檔。
- 返回
NULL情況:JSON 文檔或者路徑為NULL。 報(bào)錯(cuò)情況:json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式或者其中包含*或**。
示例:
SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$', 4); // [1, 2, 3, 4]
SELECT JSON_ARRAY_APPEND('[1, [2, 3]]', '$[0]', 4); // [[1, 4], [2, 3]]
SELECT JSON_ARRAY_APPEND('[1, [2, 3]]', '$[1]', 4); // [1, [2, 3, 4]]
SELECT JSON_ARRAY_APPEND('{"name": "Tim", "hobby": ["car"]}', '$.hobby', "food"); // {"name": "Tim", "hobby": ["car", "food"]}
SELECT JSON_ARRAY_APPEND('1', '$', 2); // [1, 2]
十、JSON_ARRAY_INSERT 指定位置插入值
MySQL JSON_ARRAY_INSERT() 函數(shù)向 JSON 文檔中的指定的數(shù)組中的指定位置插入一個(gè)值并返回新的 JSON 文檔。
語(yǔ)法:
JSON_ARRAY_INSERT(json, path, value[, path2, value2] ...)
參數(shù)說明:
json:必需的。被修改的 JSON 文檔。path:必需的。插入新元素的數(shù)組元素位置。一個(gè)有效的路徑表達(dá)式,它不能包含*或**。比如$[0]和$.a[0]表示在數(shù)組的開頭插入新元素。value:必需的。被插入到數(shù)組的新元素值。
返回值:
- 插入后的JSON文檔。
- 返回
NULL情況:JSON 文檔或者路徑為NULL。 報(bào)錯(cuò)情況:json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式或者其中包含*或**。path指示的不是數(shù)組元素的路徑。
示例:
set @str = '[1, [2, 3], {"a": [4, 5]}]'
SELECT
JSON_ARRAY_INSERT(@str, '$[0]', 0), // [0, 1, [2, 3], {"a": [4, 5]}]
JSON_ARRAY_INSERT(@str, '$[1]', 0), // [1, 0, [2, 3], {"a": [4, 5]}]
JSON_ARRAY_INSERT(@str, '$[2]', 0), // [1, [2, 3], 0, {"a": [4, 5]}]
JSON_ARRAY_INSERT(@str, '$[1][0]', 0), // [1, [0, 2, 3], {"a": [4, 5]}]
JSON_ARRAY_INSERT(@str, '$[2].a[0]', 0); // [1, [2, 3], {"a": [0, 4, 5]}]十一、JSON_CONTAINS_PATH 判斷是否存在
MySQL JSON_CONTAINS_PATH() 函數(shù)檢查一個(gè) JSON 文檔中在指定的路徑上是否有值存在。
語(yǔ)法:
JSON_CONTAINS_PATH(json, one_or_all, path[, path])
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。one_or_all:必需的。可用值:'one','all'。它指示是否檢查所有的路徑。path:必需的。您應(yīng)該至少指定一個(gè)路徑表達(dá)式。
返回值:
- 有值返回 1, 否則返回 0。
- one_or_all參數(shù)說明:
- 'one':任意一個(gè)路徑上有值,返回1,否則返回 0。
- 'all':所有路徑都有值,返回1,否則返回 0。
- 報(bào)錯(cuò)情況:
json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式。
示例:
SELECT
JSON_CONTAINS_PATH('[1, 2, {"x": 3}]', 'all', '$[0]'), // 1
JSON_CONTAINS_PATH('[1, 2, {"x": 3}]', 'all', '$[3]'), // 0
JSON_CONTAINS_PATH('[1, 2, {"x": 3}]', 'all', '$[2].x'), // 1
JSON_CONTAINS_PATH('[1, 2, {"x": 3}]', 'one', '$[0]', '$[3]'), // 1
JSON_CONTAINS_PATH('[1, 2, {"x": 3}]', 'all', '$[0]', '$[3]'); // 0
十二、JSON_INSERT 插入數(shù)據(jù)
MySQL JSON_INSERT() 函數(shù)向一個(gè) JSON 文檔中插入數(shù)據(jù)并返回新的 JSON 文檔。
語(yǔ)法:
JSON_INSERT(json, path, value[, path2, value2] ...)
參數(shù)說明:
json:必需的。被修改的 JSON 文檔。path:必需的。一個(gè)有效的路徑表達(dá)式,它不能包含*或**。value:必需的。被插入的數(shù)據(jù)。
返回值:
- 插入后的JSON文檔。(若已存在, 則不插入)
path為$:返回原JSON文檔。- 返回
NULL情況:JSON 文檔或者路徑為NULL。 報(bào)錯(cuò)情況:json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式或者其中包含*或**。
示例:
SET @arr = '[1, [2, 3], {"a": [4, 5]}]';
SELECT JSON_INSERT(@arr, '$[0]', 0, '$[3]', 6); // [1, [2, 3], {"a": [4, 5]}, 6]
SET @obj = '{"x": 1}';
SELECT JSON_INSERT(@obj, '$.y', '2'); // {"x": 1, "y": "2"}十三、JSON_MERGE 多個(gè)JSON合并
MySQL JSON_MERGE() 函數(shù)合并兩個(gè)或多個(gè) JSON 文檔并返回合并的結(jié)果。
語(yǔ)法:
JSON_MERGE(json1, json2, ...)
參數(shù)說明:
json1:必需的。一個(gè) JSON 對(duì)象文檔。json2:必需的。一個(gè) JSON 對(duì)象文檔。
返回值:
- 合并后的新JSON文檔。
- 返回
NULL情況:任意一個(gè)參數(shù)為NULL。 - 報(bào)錯(cuò)情況:參數(shù)不是有效的 JSON 文檔。
示例:
SELECT JSON_MERGE('1', 'true', '"hello"', 'null'); // [1, true, "hello", null]
SELECT JSON_MERGE('[1, 2]', '[2, 3]'); // [1, 2, 2, 3]
SELECT JSON_MERGE('{"x": 1}', '{"x": 2, "y": 3}'); // {"x": [1, 2], "y": 3}
SELECT JSON_MERGE('{"x": 1}', '[1, 2]'); // [{"x": 1}, 1, 2]
十四、JSON_MERGE_PATCH 多個(gè)JSON替換合并
MySQL JSON_MERGE_PATCH() 函數(shù)對(duì)兩個(gè)或多個(gè) JSON 文檔執(zhí)行替換合并并返回合并的結(jié)果。
替換合并:在相同鍵值時(shí),只保留后面的值。
語(yǔ)法:
JSON_MERGE_PATCH(json1, json2, ...)
參數(shù)說明:
json1:必需的。一個(gè) JSON 對(duì)象文檔。json2:必需的。一個(gè) JSON 對(duì)象文檔。
返回值:
- 合并后的JSON文檔。
- 合并規(guī)則如下:
- 若第一個(gè)參數(shù)不是對(duì)象,則合并的結(jié)果與第二個(gè)參數(shù)合并空對(duì)象的結(jié)果相同。
- 若第二個(gè)參數(shù)不是對(duì)象,則合并的結(jié)果為第二個(gè)參數(shù)。
- 若兩個(gè)參數(shù)都是對(duì)象,則合并的對(duì)象具有以下成員:
- 只存在于第一個(gè)對(duì)象中的成員。
- 只存在于第二個(gè)對(duì)象中且值不是
null的成員。 - 存在于第二個(gè)對(duì)象且值不是
null,并且在第一個(gè)對(duì)象中有對(duì)應(yīng)的相同鍵的成員。
- 返回
NULL情況:任意一個(gè)參數(shù)為NULL。 報(bào)錯(cuò)情況:任意一個(gè)參數(shù)不是有效的 JSON 文檔。
示例:
SELECT
JSON_MERGE_PATCH('2', 'true'), // true
JSON_MERGE_PATCH('[1, 2]', '[2, 3]'), // [2, 3]
JSON_MERGE_PATCH('{"x": 1, "z": 7}', '{"x": 2, "y": 3}'), // {"x": 2, "y": 3, "z": 7}
JSON_MERGE_PATCH('{"x": 1, "z": 7}', '{"x": 2, "z": null}'); // {"x": 2}十五、JSON_MERGE_PRESERVE 多個(gè)JSON合并
MySQL JSON_MERGE_PRESERVE() 函數(shù)合并兩個(gè)或多個(gè) JSON 文檔并返回合并的結(jié)果。
此函數(shù)和 JSON_MERGE_PATCH() 用法相同,但是合并邏輯有所不同。
不同規(guī)則合并如下:
- 兩個(gè)數(shù)組合并為一個(gè)數(shù)組,保留所有數(shù)組中的元素。
- 兩個(gè)對(duì)象合并為一個(gè)對(duì)象,保留所有的鍵和值。
- 一個(gè)純值會(huì)被包裝成一個(gè)數(shù)組并作為數(shù)組進(jìn)行合并。
- 對(duì)象和數(shù)組合并時(shí),會(huì)將對(duì)象包裝到一個(gè)數(shù)組中并作為數(shù)組進(jìn)行合并。
示例:
SELECT
JSON_MERGE_PRESERVE('2', 'true'), // [2, true]
JSON_MERGE_PRESERVE('[1, 2]', '[2, 3]'), // [1, 2, 2, 3]
JSON_MERGE_PRESERVE('{"x": 1, "z": 7}', '{"x": 2, "y": 3}'), // {"x": [1, 2], "y": 3, "z": 7}
JSON_MERGE_PRESERVE('{"x": 1, "z": 7}', '{"x": 2, "z": null}'); // {"x": [1, 2], "z": [7, null]}
十六、JSON_OVERLAPS 判斷有無相同鍵或值
MySQL JSON_OVERLAPS() 函數(shù)檢測(cè)兩個(gè) JSON 文檔是否擁有任何一個(gè)相同鍵值對(duì)或數(shù)組元素。
語(yǔ)法:
JSON_OVERLAPS(json1, json2)
參數(shù)說明:
json1:必需的。一個(gè) JSON 文檔。json2:必需的。另一個(gè) JSON 文檔。
返回值:
- 兩個(gè)JSON文檔重疊的內(nèi)容返回 1,否則返回 0。
- 函數(shù)判斷規(guī)則如下:
- 比較兩個(gè)數(shù)組時(shí),如果兩個(gè)數(shù)組至少有一個(gè)相同的元素返回
1,否則返回0。 - 比較兩個(gè)對(duì)象時(shí),如果兩個(gè)對(duì)象至少有一個(gè)相同的鍵值對(duì)返回
1,否則返回0。 - 比較兩個(gè)純值時(shí),如果兩個(gè)值相同返回
1,否則返回0。 - 比較純值和數(shù)組時(shí),如果值是這個(gè)數(shù)組中的直接元素返回
1,否則返回0。 - 比較純值和對(duì)象的結(jié)果為
0。 - 比較數(shù)組和對(duì)象的結(jié)果為
0。
- 比較兩個(gè)數(shù)組時(shí),如果兩個(gè)數(shù)組至少有一個(gè)相同的元素返回
- 返回
NULL情況:參數(shù)為NULL。 報(bào)錯(cuò)情況:任意一個(gè)參數(shù)不是有效的 JSON 文檔。
示例:
SELECT
JSON_OVERLAPS('[1, 2, 3]', '[3, 4, 5]'), // 1
JSON_OVERLAPS('[1, 2, [3]]', '[3, 4, 5]'), // 0
JSON_OVERLAPS('{"x": 1}', '{"x": 1, "y": 2}'), // 1
JSON_OVERLAPS('{"x": 1}', '{"y": 2}'), // 0
JSON_OVERLAPS('[1, 2, 3]', '3'), // 1
JSON_OVERLAPS('[1, 2, [3]]', '3'); // 0
十七、JSON_PRETTY 格式化輸出
MySQL JSON_PRETTY() 函數(shù)格式化輸出一個(gè) JSON 文檔,以便更易于閱讀。
語(yǔ)法:
JSON_PRETTY(json)
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔或 JSON 類型的值。
返回值:
- 格式化輸出JSON文檔,易于閱讀。
示例:
SELECT JSON_PRETTY('[1, 2, 3]');
[
1,
2,
3
]
SELECT JSON_PRETTY('{"x": 1, "y": 2}');
{
"x": 1,
"y": 2
}十八、JSON_REMOVE 刪除指定數(shù)據(jù)
MySQL JSON_REMOVE() 函數(shù)從一個(gè) JSON 文檔中刪除由路徑指定的數(shù)據(jù)并返回修改后的 JSON 文檔。
語(yǔ)法:
JSON_REMOVE(json, path[, path] ...)
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。path:必需的。一個(gè)有效的路徑表達(dá)式,它不能包含*或**。
返回值:
- 刪除后的JSON文檔。
- 返回
NULL情況:JSON 文檔或者路徑為NULL。 報(bào)錯(cuò)情況;json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式或者等于$或者其中包含*或**
示例:
SELECT
JSON_REMOVE('[0, 1, 2, [3, 4]]', '$[0]', '$[2]'), // [1, 2]
JSON_REMOVE('{"x": 1, "y": 2}', '$.x'); // {"y": 2}十九、JSON_REPLACE 替換數(shù)據(jù)
MySQL JSON_REPLACE() 函數(shù)在一個(gè) JSON 文檔中替換已存在的數(shù)據(jù)并返回新的 JSON 文檔。
語(yǔ)法:
JSON_REPLACE(json, path, value[, path2, value2] ...)
參數(shù)說明:
json:必需的。被修改的 JSON 文檔。path:必需的。一個(gè)有效的路徑表達(dá)式,它不能包含*或**。value:必需的。新的數(shù)據(jù)。
返回值:
- 替換后的JSON文檔。
- 回
NULL情況:JSON 文檔或者路徑為NULL。 - 報(bào)錯(cuò)情況:
json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式或者其中包含*或**。
示例:
SET @arr = '[1, [2, 3]]';
SELECT
JSON_REPLACE(@arr, '$[0]', 0, '$[2]', 6), // [0, [2, 3]]
JSON_REPLACE(@arr, '$[0]', 0, '$[1]', 6); // [0, 6]
SET @obj = '{"x": 1}';
SELECT
JSON_REPLACE(@obj, '$.x', 'true', '$.y', 'true'); // {"x": "true"}
JSON_REPLACE(@obj, '$.x', '[1, 2]'), // {"x": "[1, 2]"}
JSON_REPLACE(@obj, '$.x', JSON_ARRAY(1,2)); // {"x": [1, 2]}二十、JSON_SCHEMA_VALID 驗(yàn)證JSON文檔
MySQL JSON_SCHEMA_VALID() 函數(shù)根據(jù)指定的 JSON 模式驗(yàn)證一個(gè) JSON 文檔,并返回 1 表是驗(yàn)證通過或者返回 0 表示驗(yàn)證不通過。
語(yǔ)法:
JSON_SCHEMA_VALID(schema, json_doc)
參數(shù)說明:
schema:必需的。一個(gè) JSON 模式。它必須是一個(gè)有效的 JSON 對(duì)象。json_doc:必需的。被驗(yàn)證的 JSON 文檔。
返回值:
-
1:JSON 文檔通過了驗(yàn)證。 -
0:JSON 文檔沒有通過驗(yàn)證。 - 返回
NULL情況:任何一個(gè)參數(shù)為NULL。
示例:
SET @schema = '{
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -128,
"maximum": 127
},
"y": {
"type": "number",
"minimum": -128,
"maximum": 127
}
},
"required": ["x", "y"]
}';
SELECT
JSON_SCHEMA_VALID(@schema, '{"x": 1}'), // 0
JSON_SCHEMA_VALID(@schema, '{"x": 1, "y": 2}') // 1
二十一、JSON_SCHEMA_VALIDATION_REPORT 驗(yàn)證JSON文檔
MySQL JSON_SCHEMA_VALIDATION_REPORT() 函數(shù)根據(jù)指定的 JSON 模式驗(yàn)證一個(gè) JSON 文檔,并返回一個(gè)驗(yàn)證報(bào)告。
語(yǔ)法:
JSON_SCHEMA_VALIDATION_REPORT(schema, json_doc)
參數(shù)說明:
schema:必需的。一個(gè) JSON 模式。它必須是一個(gè)有效的 JSON 對(duì)象。json_doc:必需的。被驗(yàn)證的 JSON 文檔。
返回值:
- 驗(yàn)證結(jié)果的報(bào)告。
- {"valid": true}:驗(yàn)證通過。
- {"valid": false, reason:'...'}:驗(yàn)證不通過,reason為不通過原因。
示例:
SET @schema = '{
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"y": {
"type": "number",
"minimum": -180,
"maximum": 180
}
},
"required": ["x", "y"]
}';
SELECT
JSON_SCHEMA_VALIDATION_REPORT(@schema, '{"x": 1}'), // {"valid": false, "reason": "The JSON document location '#' failed requirement 'required' at JSON Schema location '#'", "schema-location": "#", "document-location": "#", "schema-failed-keyword": "required"}
JSON_SCHEMA_VALIDATION_REPORT(@schema, '{"x": 1, "y": 2}') // {"valid": true}
二十二、JSON_SEARCH 查找
MySQL JSON_SEARCH() 函數(shù)返回一個(gè)給定字符串在一個(gè) JSON 文檔中的路徑。
語(yǔ)法:
JSON_SEARCH(json, one_or_all, search_str) JSON_SEARCH(json, one_or_all, search_str, escape_char) JSON_SEARCH(json, one_or_all, search_str, escape_char, path)
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。one_or_all:必需的??捎弥担?code>'one','all'。 規(guī)則如下:'one':返回第一個(gè)匹配的路徑。'all':返回所有匹配的路徑。所有的路徑會(huì)包裝在一個(gè)數(shù)組內(nèi)返回。
search_str:必需的。被搜索的字符串。 您可以在search_str參數(shù)中使用%和_通配符,就像 LIKE 一樣:%匹配任意數(shù)量的任意字符。_匹配一個(gè)任意字符。
escape_char:可選的。 如果search_str中包含%和_,需要在他們之前添加轉(zhuǎn)移字符。默認(rèn)是\。path:可選的。只能在此路徑下進(jìn)行搜索。
返回值:
- 一個(gè)路徑字符串或者由多個(gè)路徑組成的數(shù)組。
- 返回
NULL情況:- 未搜索到指定的字符串。
- JSON 文檔中不存在指定的
path。 - 任意一個(gè)參數(shù)為
NULL。
報(bào)錯(cuò)情況:json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式。
示例:
SET @json = '{
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"y": {
"type": "number",
"minimum": -180,
"maximum": 180
}
},
"required": ["x", "y"]
}';
SELECT
JSON_SEARCH(@json, 'one','number'), // "$.properties.x.type"
JSON_SEARCH(@json, 'all','number') // ["$.properties.x.type", "$.properties.y.type"]
二十三、JSON_SET 插入或更新數(shù)據(jù)
MySQL JSON_SET() 函數(shù)在一個(gè) JSON 文檔中插入或更新數(shù)據(jù)并返回新的 JSON 文檔。它相當(dāng)于是 JSON_INSERT() 和 JSON_REPLACE() 的組合。
語(yǔ)法:
JSON_SET(json, path, value[, path2, value2] ...)
參數(shù)說明:
json:必需的。被修改的 JSON 文檔。path:必需的。一個(gè)有效的路徑表達(dá)式,它不能包含*或**。value:必需的。要設(shè)置的數(shù)據(jù)。
返回值:
- 插入或更新數(shù)據(jù)并返回新的 JSON 文檔。規(guī)則如下:
- 存在路徑:更新。
- 不存在路徑:添加。
- 若
value為字符串:直接插入。 - 返回
NULL情況:JSON 文檔或者路徑為NULL。 報(bào)錯(cuò)情況:json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式或者其中包含*或**。
示例:
SET @obj = '{"x": 1}';
SELECT
JSON_SET(@obj, '$.x', '10', '$.y', '[1, 2]'), // {"x": "10", "y": "[1, 2]"}
JSON_SET(@obj, '$.x', '10', '$.y', '{"z": 2}'), // {"x": "10", "y": "{\"z\": 2}"}
JSON_SET(@obj, '$.x', '10', '$.y', CAST('[1, 2]' AS JSON)); // {"x": "10", "y": [1, 2]}二十四、JSON_STORAGE_FREE 釋放空間
MySQL JSON_STORAGE_FREE() 函數(shù)返回一個(gè) JSON 列在被 JSON_SET()、JSON_REPLACE() 或 JSON_REMOVE() 更新后所釋放的空間。
語(yǔ)法:
JSON_STORAGE_FREE(json)
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。它可以是一個(gè) JSON 字符串,或者一個(gè) JSON 列。
返回值:
- 一個(gè) JSON 列在被 JSON_SET()、JSON_REPLACE() 或 JSON_REMOVE() 更新后所釋放的空間。它可以接受一個(gè) JSON 字符串,或者一個(gè) JSON 列作為參數(shù)。
- 返回 0 情況:
- 參數(shù)是一個(gè) JSON 字符串。
- 列沒有被更新過,或不是使用JSON_SET()、JSON_REPLACE() 或 JSON_REMOVE() 部分更新。
- 內(nèi)容在更新后變的更大了
。
- 返回更新后釋放的空間:列(數(shù)據(jù)庫(kù)表的列)被 JSON_SET()、JSON_REPLACE() 或 JSON_REMOVE() 部分更新。
- 返回
NULL情況:參數(shù)為NULL。 報(bào)錯(cuò)情況:json不是有效的 JSON 文檔。
示例:
DROP TABLE IF EXISTS test;
CREATE TABLE test (
json_col JSON NOT NULL
);
INSERT INTO test
VALUES ('{"x": 1, "y": "99"}');
SELECT
json_col, // {"x": 1, "y": "99"}
JSON_STORAGE_SIZE(json_col), // 24
JSON_STORAGE_FREE(json_col) // 0
FROM
test;
// {"x": 1, "y": "99"} | 24 | 0
UPDATE test
SET json_col = JSON_REMOVE(json_col, '$.y');
SELECT
json_col, // {"x": 1}
JSON_STORAGE_SIZE(json_col), // 24
JSON_STORAGE_FREE(json_col) // 11
FROM
test;二十五、JSON_STORAGE_SIZE 占用字節(jié)數(shù)
MySQL JSON_STORAGE_SIZE() 函數(shù)返回存儲(chǔ)一個(gè) JSON 文檔的二進(jìn)制表示所占用的字節(jié)數(shù)。
語(yǔ)法:
JSON_STORAGE_SIZE(json)
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。它可以是一個(gè) JSON 字符串,或者一個(gè) JSON 列。
返回值:
- JSON 文檔的二進(jìn)制表示所占用的字節(jié)數(shù)。
- 返回
NULL:參數(shù)為NULL。 - 報(bào)錯(cuò)情況:
json不是有效的 JSON 文檔。
示例:
SELECT
JSON_STORAGE_SIZE('100'), // 3
JSON_STORAGE_SIZE('"a"'), // 3
JSON_STORAGE_SIZE('true'), // 2
JSON_STORAGE_SIZE('null'); // 2二十六、JSON_TABLE 提取數(shù)據(jù)
MySQL JSON_TABLE() 函數(shù)從一個(gè)指定的 JSON 文檔中提取數(shù)據(jù)并返回一個(gè)具有指定列的關(guān)系表。
語(yǔ)法:
JSON_TABLE(
json,
path COLUMNS (column[, column[, ...]])
)
column:
name FOR ORDINALITY
| name type PATH string_path [on_empty] [on_error]
| name type EXISTS PATH string_path
| NESTED [PATH] path COLUMNS (column[, column[, ...]])
on_empty:
{NULL | DEFAULT json_string | ERROR} ON EMPTY
on_error:
{NULL | DEFAULT json_string | ERROR} ON ERROR
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。path:必需的。一個(gè)路徑表達(dá)式。column:必需的。定義一個(gè)列??梢允褂萌缦?4 中方式定義列:name FOR ORDINALITY: 生成一個(gè)從 1 開始的計(jì)數(shù)器列,名字為name。name type PATH string_path [on_empty] [on_error]: 將由路徑表達(dá)式string_path指定的值放在名字為name的列中。name type EXISTS PATH string_path:根據(jù)string_path指定的位置是否有值將1或0放在名字為name的列中。NESTED [PATH] path COLUMNS (column[, column[, ...]]): 將內(nèi)嵌的對(duì)象或者數(shù)組中的數(shù)據(jù)拉平放在一行中。
- on_empty:可選的。如果指定了,它決定了指定路徑下沒有數(shù)據(jù)時(shí)的返回值:
- NULL ON EMPTY: 如果指定路徑下沒有數(shù)據(jù),JSON_TABLE() 函數(shù)將使用 NULL,這是默認(rèn)的行為。
- DEFAULT value ON EMPTY: 如果指定路徑下沒有數(shù)據(jù),JSON_TABLE() 函數(shù)將使用 value。
- ERROR ON EMPTY: 如果指定路徑下沒有數(shù)據(jù),JSON_TABLE() 函數(shù)將拋出一個(gè)錯(cuò)誤。
- on_error:可選的。如果指定了,它決定了處理錯(cuò)誤的邏輯:
- NULL ON ERROR: 如果有錯(cuò)誤,JSON_TABLE() 函數(shù)將使用 NULL,這是默認(rèn)的行為。
- DEFAULT value ON ERROR: 如果有錯(cuò)誤,JSON_TABLE() 函數(shù)將使用 value。
- ERROR ON ERROR: 如果有錯(cuò)誤,JSON_TABLE() 函數(shù)將拋出一個(gè)錯(cuò)誤。
返回值:
- 具有指定列的關(guān)系表。
示例:
SELECT
*
FROM
JSON_TABLE(
'[{"x":10,"y":11}, {"y": 21}, {"x": 30}]',
'$[*]'
COLUMNS (
id FOR ORDINALITY,
x INT PATH '$.x' DEFAULT '100' ON EMPTY,
y INT PATH '$.y'
)
) AS t;
id x y
+------+-------+--------+
| 1| 10| 11|
+-----------------------+
| 2| 100| 21|
+------+-------+--------+
| 2| 30| NULL|
+------+-------+--------+
示例說明:
- 路徑表達(dá)式$[*]: 數(shù)組中的每個(gè)元素,也就是數(shù)組中的那兩個(gè)對(duì)象。
- $[0]:只提取 JSON 數(shù)組中的第 1 元素
- $[1]:只提取 JSON 數(shù)組中的第 2 元素
- 以此類推
- COLUMNS 子句定義了關(guān)系表中的 3 個(gè)列:
- id FOR ORDINALITY: 列名為 id,列的內(nèi)容為從 1 開始的自增序列。
- x INT PATH '$.x' DEFAULT '100' ON EMPTY: 當(dāng)對(duì)象中不存在成員 x 或者 x 的值為空時(shí)要使用默認(rèn)值 100。
- y INT PATH '$.y: 列名為 y,列的內(nèi)容是對(duì)應(yīng)了對(duì)象中的成員 y。
- 其中 $.x 和 $.y 中的 $ 代表了當(dāng)前的上下文對(duì)象,也就是數(shù)組中的每個(gè)對(duì)象。
拉平內(nèi)嵌的數(shù)組示例:
SELECT
*
FROM
JSON_TABLE(
'[{"x":10,"y":[11, 12]}, {"x":20,"y":[21, 22]}]',
'$[*]'
COLUMNS (
x INT PATH '$.x',
NESTED PATH '$.y[*]' COLUMNS (y INT PATH '$')
)
) AS t;
x y
+------+-------+
| 10 | 11 |
| 10 | 12 |
| 20 | 21 |
| 20 | 22 |
+------+-------+示例說明:
- NESTED PATH '$.y[*]' COLUMNS (y INT PATH '$'):展開
y對(duì)應(yīng)的數(shù)組,并將y數(shù)組中的每個(gè)元素放入名稱為y的列中。
拉平內(nèi)嵌的對(duì)象:
SELECT
*
FROM
JSON_TABLE(
'[{"x":10,"y":{"a":11,"b":12}},{"x":20,"y":{"a":21,"b":22}}]',
'$[*]'
COLUMNS (
x INT PATH '$.x',
NESTED PATH '$.y' COLUMNS (
ya INT PATH '$.a',
yb INT PATH '$.b'
)
)
) AS t;
x ya yb
+------+-------+-------+
| 10 | 11 | 12 |
| 20 | 21 | 22 |
+------+-------+-------+示例說明:
NESTED PATH '$.y'子句將對(duì)象y中成員提取到 2 列:- 成員
a被提取到列ya。 - 成員
b被提取到列yb。
- 成員
二十七、JSON_TYPE 取類型
MySQL JSON_TYPE() 函數(shù)返回一個(gè)給定的 JSON 值的類型。
語(yǔ)法:
JSON_TYPE(json_value)
參數(shù)說明:
json_value:必需的。一個(gè) JSON 值。
返回值:(一個(gè) utf8mb4 字符串)
OBJECT: JSON 對(duì)象。ARRAY: JSON 數(shù)組BOOLEAN: JSON 布爾值NULL: JSONnull值INTEGER: MySQLTINYINT,SMALLINT,MEDIUMINT,INT和BIGINT類型的值DOUBLE: MySQLDOUBLE和FLOAT類型的值DECIMAL: MySQLDECIMAL和NUMERIC類型的值DATETIME: MySQLDATETIME和TIMESTAMP類型的值DATE: MySQLDATE類型的值TIME: MySQLTIME類型的值STRING: MySQLCHAR,VARCHAR,TEXT,ENUM和SETBLOB: MySQLBINARY,VARBINARY,BLOB和BITOPAQUE: 以上之外的類型
示例:
SELECT
JSON_TYPE('true'), // BOOLEAN
JSON_TYPE('null'), // NULL
JSON_TYPE('"abc"'); // STRING二十八、JSON_VALID 驗(yàn)證有校性
MySQL JSON_VALID() 函數(shù)返回 0 和 1 來指示給定的參數(shù)是否是一個(gè)有效的 JSON 文檔。
語(yǔ)法:
JSON_VALID(str)
參數(shù)說明:
str:必需的。需要被驗(yàn)證的內(nèi)容。
返回值:
- 1:是JSON文檔。
- 0:不是JSON文檔。
- 返回
NULL情況:參數(shù)為NULL。
示例:
SELECT
JSON_VALID(1), // 0
JSON_VALID('1'), // 1
JSON_VALID(true), // 0
JSON_VALID('true'), // 1
JSON_VALID('abc'), // 0
JSON_VALID('"abc"'), // 1
JSON_VALID('{"a": 1}'), // 1
JSON_VALID('{a: 1}'); // 0二十九、JSON_VALUE 提取指定路徑的值
MySQL JSON_VALUE() 函數(shù)從一個(gè)指定的 JSON 文檔中提取指定路徑的值并返回。
語(yǔ)法:
JSON_VALUE(json, path [RETURNING type] [{NULL | ERROR | DEFAULT value} ON EMPTY] [{NULL | ERROR | DEFAULT value} ON ERROR])
參數(shù)說明:
json:必需的。一個(gè) JSON 文檔。path:必需的。一個(gè)路徑表達(dá)式。RETURNING type可選的。他決定了返回值的類型。您可以使用下面值中的一個(gè):
FLOATDOUBLEDECIMALSIGNEDUNSIGNEDDATETIMEDATETIMEYEAR(MySQL 8.0.22 and later)CHARJSON
{NULL | ERROR | DEFAULT value} ON EMPTY:可選的。如果指定了,它決定了指定路徑下沒有數(shù)據(jù)的返回值:NULL ON EMPTY: 如果指定路徑下沒有數(shù)據(jù),JSON_VALUE()函數(shù)將返回NULL,這是默認(rèn)的行為。DEFAULT value ON EMPTY: 如果指定路徑下沒有數(shù)據(jù),JSON_VALUE()函數(shù)將返回value。ERROR ON EMPTY: 如果指定路徑下沒有數(shù)據(jù),JSON_VALUE()函數(shù)將拋出一個(gè)錯(cuò)誤。
{NULL | ERROR | DEFAULT value} ON ERROR:可選的。如果指定了,它決定了處理錯(cuò)誤的邏輯:NULL ON ERROR: 如果有錯(cuò)誤,JSON_VALUE()函數(shù)將返回NULL,這是默認(rèn)的行為。DEFAULT value ON ERROR: 如果有錯(cuò)誤,JSON_VALUE()函數(shù)將返回value。ERROR ON ERROR: 如果有錯(cuò)誤,JSON_VALUE()函數(shù)將拋出一個(gè)錯(cuò)誤。
返回值:
- 路徑上的數(shù)據(jù)。
- 報(bào)錯(cuò)情況:
json不是有效的 JSON 文檔。path不是有效的路徑表達(dá)式。
示例:
SET @json = '[
{
"name": "cxian",
"age": 22,
},
{
"name": "jie",
"age": 23 }
]';
SELECT
JSON_VALUE(@json, '$[0].age'), // 22
JSON_VALUE(@json, '$[1].age'); // 23
JSON_VALUE(@json, '$[1].age' RETURNING DECIMAL(9,2)), // 23.00
JSON_VALUE(@json, '$[0].note' DEFAULT 'Nothing' ON EMPTY) // Nothing三十、MEMBER OF 是否為數(shù)組的元素
MySQL MEMBER OF() 函數(shù)檢查一個(gè)指定的值是否是一個(gè) JSON 數(shù)組中的元素。
語(yǔ)法:
value MEMBER OF(value, json_array)
參數(shù)說明:
value:必需的。一個(gè)值。它可以是任意類型。json_array:必需的。一個(gè) JSON 數(shù)組。
返回值:
- 1:json_array中包含value,或 json_array為值且與value相等。
- 0:數(shù)組中不包含value。
- 報(bào)錯(cuò)情況:
json_array不是有效的 JSON 文檔。
示例:
SELECT
1 MEMBER OF('[1, 2, "a"]'), // 1
'a' MEMBER OF('"a"'), // 1
CAST('true' AS JSON) MEMBER OF('true') // 1三十一、JSON_QUOTE 包裝成JSON串
MySQL JSON_QUOTE() 函數(shù)使用雙引號(hào)包裝一個(gè)值,使其成為一個(gè) JSON 字符串值。
語(yǔ)法:
JSON_QUOTE(str)
參數(shù)說明:
str:必需的。一個(gè)字符串。
返回值:
- 一個(gè)使用雙引號(hào)包圍的 JSON 字符串值。
- 返回
NULL情況:參數(shù)為NULL。 - 特殊字符將使用反斜杠轉(zhuǎn)義:
- \":雙引號(hào) "
- \b:退格字符
- \f:換頁(yè)符
- \n:換行符
- \r:回車符
- \t:制表符
- \\:反斜杠 \
- \uXXXX:Unicode 值 XXXX 的 UTF-8 字節(jié)
示例:
SELECT
JSON_QUOTE('1'), // "1"
JSON_QUOTE('NULL'), // "NULL"
JSON_QUOTE('"NULL"') // "\"NULL\""總結(jié)
到此這篇關(guān)于輕松上手MYSQL之JSON函數(shù)實(shí)現(xiàn)高效數(shù)據(jù)查詢與操作的文章就介紹到這了,更多相關(guān)MYSQL JSON函數(shù)數(shù)據(jù)查詢與操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中SQL命令語(yǔ)句條件查詢實(shí)例詳解
SELECT語(yǔ)句可以通過WHERE條件來設(shè)定查詢條件,查詢結(jié)果是滿足查詢條件的記錄,下面這篇文章主要給大家介紹了關(guān)于MySQL中SQL命令語(yǔ)句條件查詢的相關(guān)資料,需要的朋友可以參考下2022-11-11
千萬級(jí)記錄的Discuz論壇導(dǎo)致MySQL CPU 100%的優(yōu)化筆記
談到自己在解決一個(gè)擁有 60 萬條記錄的 MySQL 數(shù)據(jù)庫(kù)訪問時(shí),導(dǎo)致 MySQL CPU 占用 100% 的經(jīng)過。在解決問題完成優(yōu)化(optimize)之后,我發(fā)現(xiàn) Discuz 論壇也存在這個(gè)問題,當(dāng)時(shí)稍微提了一下2010-12-12
mysql數(shù)據(jù)庫(kù)中字符集亂碼問題原因及解決
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)中字符集亂碼問題原因及解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
mysql單一的事務(wù)single-transaction選項(xiàng)詳解
利用 --single-transaction 選項(xiàng)可以有效地確保 LOAD DATA INFILE 操作的原子性和數(shù)據(jù)一致性,特別適合于需要高可靠性的批量數(shù)據(jù)導(dǎo)入場(chǎng)景,這篇文章給大家介紹mysql單一的事務(wù)single-transaction選項(xiàng)的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2025-05-05

