MySQL關於常用JSON字串操作
阿新 • • 發佈:2022-04-22
測試資料
CREATE TABLE `demo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `remark` longtext NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB; INSERT INTO `demo` VALUES (1, 'hello'), (2, '{\"name\": \"Andy\", \"age\": 12}'), (3, '{\"name\": \"Andy\", \"age\": 12, \"new name\": \"Bob\"}'), (4, '{\"name\": \"Andy\", \"age\": 12, \"new name\": \"Bob\", \"score\": {\"english\": 90, \"math\": 100}}'), (5, '[\"Andy\", \"Bob\", \"Cindy\"]'), (6, '[{\"name\": \"Andy\", \"age\": 12}, {\"name\": \"Bob\", \"age\": 13}]'), (7, '[{\"name\": \"Andy\", \"age\": 12}, {\"name\": \"Andy\", \"age\": 13}]');
一、查詢函式
1. JSON_EXTRACT
含義:提取指定路徑的值
格式:JSON_EXTRACT(欄位, 路徑)
1.1 對於 JSON_OBJECT
,路徑格式為 $.KeyName
SELECT JSON_EXTRACT(remark, '$.name') FROM demo WHERE id = 2
字串的值提取出來後會帶雙引號,用
REPLACE
替換掉即可:SELECT REPLACE(JSON_EXTRACT(remark, '$.name'), '"', '') FROM demo WHERE id = 2
或者用
JSON_UNQUOTE
SELECT JSON_UNQUOTE(JSON_EXTRACT(remark, '$.name')) FROM demo WHERE id = 2
如果路徑有空格,必須用雙引號括起來
SELECT JSON_EXTRACT(remark, '$."new name"') FROM demo WHERE id = 3
允許多級路徑,用.
連續呼叫
SELECT JSON_EXTRACT(remark, '$.score.english') AS ENG, JSON_EXTRACT(remark, '$.score.math') AS MATH
FROM demo WHERE id = 4
可以用萬用字元*
,獲取指定路徑下的所有值,比如獲取根路徑
的所有值
SELECT JSON_EXTRACT(remark, '$.*') FROM demo WHERE id = 3
同理也可以指定多級路徑
SELECT JSON_EXTRACT(remark, '$.score.*') FROM demo WHERE id = 4
1.2 對於 JSON_ARRAY
,路徑格式為 $[下標].KeyName
獲取下標為0
的元素
SELECT JSON_EXTRACT(remark, '$[0]') FROM demo WHERE id = 5
獲取下標為0
的元素的指定key的值
SELECT JSON_EXTRACT(remark, '$[0].age') FROM demo WHERE id = 6
可以使用萬用字元*
,獲取所有元素
SELECT JSON_EXTRACT(remark, '$[*].age') FROM demo WHERE id = 6
2. JSON_CONTAINS
含義:查詢json文件中指定路徑是否包含指定值
格式:JSON_CONTAINS(json欄位, 值, 路徑)
對於 JSON_OBJECT
SELECT JSON_CONTAINS(remark, '12', '$.age') FROM demo WHERE id = 4
對於 JSON_ARRAY
SELECT JSON_CONTAINS(remark, '12', '$[0].age') FROM demo WHERE id = 6
3. JSON_CONTAINS_PATH
含義:查詢json文件中是否包含指定路徑
格式:JSON_CONTAINS_PATH(json欄位, one / all, 路徑)。one表示一個存在即可,all表示所有都存在才滿足
SELECT JSON_CONTAINS_PATH(remark, 'one', '$.name') FROM demo WHERE id = 4
4. JSON_SEARCH
含義:返回查詢的值的所有路徑
格式:JSON_SEARCH(json欄位, one / all, 查詢值)。one表示一個存在即可,all表示所有都存在才滿足
SELECT JSON_SEARCH(remark, 'one', 'Andy') FROM demo WHERE id = 4
SELECT JSON_SEARCH(remark, 'all', 'Andy') FROM demo WHERE id = 7
二、屬性函式
1. JSON_VALID
含義:校驗 JSON 合法性
格式:JSON_VALID(val)
返回值:0:不合法,1:合法
SELECT JSON_VALID(remark) FROM demo
2. JSON_LENGTH
含義:返回 JSON 陣列或物件的長度
格式:JSON_LENGTH(json_doc[, path])
SELECT JSON_LENGTH(remark) FROM demo WHERE id = 4
SELECT JSON_LENGTH(remark, '$.score') FROM demo WHERE id = 4
3. JSON_TYPE
含義:返回json型別
格式:JSON_TYPE(json_val)
返回值:OBJECT 或 ARRAY
SELECT JSON_TYPE(remark) FROM demo WHERE id = 4
SELECT JSON_TYPE(remark) FROM demo WHERE id = 6