首頁  >  文章  >  資料庫  >  MySQL之JSON類型欄位如何使用

MySQL之JSON類型欄位如何使用

WBOY
WBOY轉載
2023-04-17 18:52:051136瀏覽

測試環境: MySQL8.0.19

準備工作

CREATE TABLE json_demo ( 
	`id` INT ( 11 ) NOT NULL PRIMARY KEY, 
	`content` json NOT NULL 
);
INSERT INTO json_demo ( id, content )
VALUES
	/*这条是数组*/
	( 1, '[{"key": 1, "order": 1, "value": "34252"},{"key": 2, "order": 2, "value": "23423"}]' ),
	/*这条是数组*/
	( 2, '[{"key": 4, "order": 4, "value": "234"},{"key": 5, "order": 5, "value": "234324523"}]' ),
	/*这条是对象*/
	( 3, '{"key": 3, "order": 3, "value": "43242"}' ),
	/*这条是对象*/
	( 4, '{"key": 6, "order": 6, "value": "5423"}' );

JSON物件基礎操作

查詢指定欄位值

/* 基础查询 */
SELECT
	content -> '$.key' AS 'key',
	JSON_EXTRACT(content, '$.key') AS 'key2',
	content -> '$.value' AS 'value',
	JSON_EXTRACT(content, '$.value') AS 'value2',
	content ->> '$.value' AS 'value3',
	JSON_UNQUOTE(JSON_EXTRACT(content, '$.value')) AS 'value4'
FROM
	json_demo 
WHERE
	id > 2;

MySQL之JSON類型欄位如何使用

TIPS:

  • ->和->>是MySQL設計的語法,其中->在MySQL5.7支持,->>在MySQL8.0中支持。

  • ->等效於JSON_EXTRACT(),當查詢欄位為字串時,其傳回值也會帶有""。

  • ->>等效於JSON_UNQUOTE(JSON_EXTRACT()),當查詢欄位為字串時,其傳回值不會帶有""。

用於條件查詢

content -> '$.key'可以看成一個字段,一個字段能做的操作基本他都能。

SELECT
	id,
	content -> '$.key' AS 'key',
	content ->> '$.value' AS 'value3'
FROM
	json_demo 
WHERE
	id > 2
	AND content -> '$.key' > 1
	AND content -> '$.value' like '%2%';

MySQL之JSON類型欄位如何使用

修改指定欄位值

/* 修改 */
UPDATE json_demo 
SET content = JSON_REPLACE(
	content,
	/* 将content.key值 + 1 */
	'$.key', content -> '$.key' + 1,
	/* 将content.value值后拼接'abc' */
	'$.value', concat(content ->> '$.value', 'abc')
) WHERE id = 3;
/* JSON_SET也可以 */
UPDATE json_demo 
SET content = JSON_SET(
	content,
	/* 将content.key值 + 1 */
	'$.key', content -> '$.key' + 1,
	/* 将content.value值后拼接'abc' */
	'$.value', concat(content ->> '$.value', 'abc')
) WHERE id = 3;
/* 查询修改结果 */
SELECT id,content,content -> '$.key' AS 'key',content ->> '$.value' AS 'value3'
FROM json_demo WHERE id = 3;
/* 重新赋值 */
UPDATE json_demo SET 
content = JSON_REPLACE(content,'$.key',3,'$.value','43242') WHERE id = 3;

MySQL之JSON類型欄位如何使用

TIPS:

  • ##JSON_REPLACE和JSON_SET都可以用來修改某個欄位值,差別在於JSON_REPLACE取代不存在的屬性時操作無效;而JSON_SET則會將這個不存在的屬性插入進去。

  • 所以JSON_SET也可以用來追加屬性,與JSON_INSERT類似。差別在於JSON_INSERT如果插入一個已存在的屬性時操作會失效,而JSON_SET會被取代。

追加元素

UPDATE json_demo 
SET content = JSON_INSERT(content, '$.key', 234)
WHERE id = 3;

SELECT id,content,content -> '$.key' AS 'key' FROM json_demo WHERE id = 3;

UPDATE json_demo 
SET content = JSON_INSERT(content, '$.temp', 234)
WHERE id = 3;

SELECT id,content,content -> '$.key' AS 'key' FROM json_demo WHERE id = 3;

UPDATE json_demo 
SET content = JSON_SET(content, '$.temp2', 432)
WHERE id = 3;

SELECT id,content,content -> '$.key' AS 'key' FROM json_demo WHERE id = 3;

MySQL之JSON類型欄位如何使用

#JSON陣列操作

查詢指定欄位值

SELECT
	id,
	content -> '$[*].key' AS 'key',
	content ->> '$[*].value' AS 'value',
	content -> '$[0].key' AS 'key2',
	content ->> '$[0].value' AS 'value2',
	/* 查询数组长度 */
	JSON_LENGTH(content) AS 'length'
FROM
	json_demo 
WHERE
	id < 3;

MySQL之JSON類型欄位如何使用

用於條件查詢

SELECT
	id,
	content -> &#39;$[*].key&#39; AS &#39;key&#39;,
	content ->> &#39;$[*].value&#39; AS &#39;value&#39;
FROM
	json_demo 
WHERE
	id < 3
	/* content.value的值中存在like&#39;%34%&#39;的值 */
	AND content ->> &#39;$[*].value&#39; like &#39;%34%&#39;
	/* content.key的值中有4 */
	AND JSON_OVERLAPS(content ->> &#39;$[*].key&#39;, &#39;4&#39; );

MySQL之JSON類型欄位如何使用

MySQL之JSON類型欄位如何使用

MySQL之JSON類型欄位如何使用

#################修改指定欄位值#########基礎運算都跟JSON物件差不太多,就是在'$'後面加對應的索引位'$[0]',指定所有則'$[*] '。如果數組包含數組,可以透過'$[1][2][3]'這種方式指定深層的數組元素。 ##################追加元素#########JSON_ARRAY_APPEND和JSON_ARRAY_INSERT都可以實作陣列元素追加。差別在於JSON_ARRAY_APPEND可以不指定索引位,此時往最後位置追加;JSON_ARRAY_INSERT必須指定索引位,不指定則會報錯。 ######JSON_ARRAY_APPEND是追加在指定索引位後面,而JSON_ARRAY_INSERT則是插入到指定索引位前面。 ############

更多操作

##JSON_DEPTH()JSON文件的最大深度JSON_EXTRACT()從JSON文件傳回資料JSON_INSERT()將資料插入JSON文件JSON_KEYS()JSON文件中的鍵數組JSON_LENGTH()#JSON文件中的元素數JSON_MERGE() (已棄用)合併JSON文檔,保留重複的鍵。 JSON_MERGE_PRESERVE()的已棄用同義詞#JSON_MERGE_PATCH()合併JSON文檔,取代重複鍵的值 JSON_MERGE_PRESERVE()合併JSON文檔,保留重複的鍵JSON_OBJECT()建立JSON物件JSON_OVERLAPS() (8.0.17引入)比較兩個JSON文檔,如果它們具有共同的任何鍵值對或數組元素,則返回TRUE(1),否則返回FALSE(0) JSON_PRETTY()以易於閱讀的格式列印JSON文件JSON_QUOTE()引用JSON文檔JSON_REMOVE()從JSON文檔中刪除資料##JSON_REPLACE()JSON_SCHEMA_VALID() (8.0.17引入)JSON_SCHEMA_VALIDATION_REPORT() (8.0.17引入)JSON_SEARCH()JSON_SET()JSON_STORAGE_FREE()#JSON_STORAGE_SIZE()JSON_TABLE()JSON_TYPE()JSON_UNQUOTE()JSON_VALID()JSON_VALUE()(8.0.21導入)MEMBER OF() (8.0.17引入)
名稱 描述
JSON_ARRAY() 建立JSON陣列
JSON_ARRAY_APPEND() 將資料附加到JSON文件
JSON_ARRAY_INSERT( ) 插入JSON陣列
JSON_CONTAINS() JSON文件是否在路徑中包含特定物件
JSON_CONTAINS_PATH() JSON文件是否在路徑中包含任何資料
替換JSON文檔中的值
根據JSON模式驗證JSON文檔;如果文檔針對架構進行了驗證,則返回TRUE / 1;否則,則返回FALSE / 0。
根據JSON模式驗證JSON文件;以JSON格式傳回有關驗證結果的報告,包括成功或失敗以及失敗原因
JSON文件中值的路徑
#將資料插入JSON文檔
部分更新後,JSON列值的二進位表示形式中的可用空間
用於儲存JSON文件的二進位表示形式的空間
#從JSON表達式傳回資料作為關係表
JSON值類型
#取消引用JSON值
JSON值是否有效
在提供的路徑所指向的位置從JSON文件中提取值;以VARCHAR(512)或指定的類型傳回此值
如果第一個操作數與作為第二個操作數傳遞的JSON數組的任何元素匹配,則返回true(1),否則返回false(0)

以上是MySQL之JSON類型欄位如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除