1. 程式人生 > 其它 >MySQL關於常用JSON字串操作

MySQL關於常用JSON字串操作

官方文件

測試資料

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

含義:返回查詢的值的所有路徑
格式: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