mysql的jsonTable使用及說(shuō)明
JSON_TABLE 是 MySQL 8.0 中一個(gè)新的 JSON 函數(shù)。它也是一個(gè)表函數(shù),返回值不是標(biāo)量值而是結(jié)果集。
JSON_TABLE 將 JSON 文檔(部分或全部)轉(zhuǎn)換為關(guān)系表,以便您可以像使用普通表一樣使用它。
JSON_TABLE 函數(shù)從一個(gè)指定的 JSON 文檔中提取數(shù)據(jù)并返回一個(gè)具有指定列的關(guān)系表??梢韵衿胀ǖ谋硪粯邮褂?JSON_TABLE () 返回的表。
json-table官方文檔地址:
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html#function_json-table
以下是jsontable的語(yǔ)法
JSON_TABLE(
expr,
path COLUMNS (column_list)
) [AS] alias
column_list:
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_list)
on_empty:
{NULL | DEFAULT json_string | ERROR} ON EMPTY
on_error:
{NULL | DEFAULT json_string | ERROR} ON ERROR
使用示例
假設(shè)我們有一個(gè)表包含ID和名稱:
CREATE TABLE t1
(
id varchar(32),
name JSON
);
添加如下數(shù)據(jù):
INSERT INTO t1
VALUES (uuid_short(), json_array('John'));
INSERT INTO t1
VALUES (uuid_short(), json_array('toma','Smith'));
INSERT INTO t1
VALUES (uuid_short(), json_array('aa','bb','cc','tt'));
現(xiàn)在,我們想要從 t1 表中查詢所有名稱和id,進(jìn)行查詢(在 MySQL 中,JSON_TABLE 函數(shù)的 JSON 路徑表達(dá)式可以使用 $ 符號(hào)來(lái)指定。
$[*] 表示提取 JSON 文檔中的所有屬性):
SELECT value,id
from t1
,
JSON_TABLE(name, '$[*]' COLUMNS (
value VARCHAR(255) PATH '$'
)) AS jt
數(shù)據(jù)將如下:

NESTED PATH 嵌套路徑
NESTED PATH為其所屬的子句中的每個(gè)匹配項(xiàng)生成一組記錄。可以解決復(fù)雜的json嵌套數(shù)據(jù)轉(zhuǎn)為行。
添加一條數(shù)據(jù):
INSERT INTO t1
VALUES ('1', json_array(json_object('a',1,'b',json_array(11,111)),
json_object('a',2, 'b',json_array(22,222)),
json_object('a',3)));
使用 NESTED PATH:
SELECT jt.*
FROM t1,
JSON_TABLE(
name,
'$[*]' COLUMNS (
a INT PATH '$.a',
NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$')
)
) AS jt
WHERE id = '1';

我們發(fā)現(xiàn)每次jsontable后依然會(huì)對(duì)應(yīng)所在的ID,比如:

上面需求的a,b列的ID就是1而不是其他ID。這其實(shí)是遵從了sql標(biāo)準(zhǔn)。
橫向派生表
根據(jù)SQL標(biāo)準(zhǔn),MySQL總是將帶有表函數(shù)(如JSON_TABLE())的連接視為使用LATERAL無(wú)論MySQL發(fā)布版本如何,都是如此,這就是為什么即使在8.0.14之前的MySQL版本中也可以加入此函數(shù)的原因。
在MySQL 8.0.14及更高版本中,LATERAL 關(guān)鍵字是隱式的,不允許在 JSON_TABLE() 之前使用。這也是根據(jù)SQL標(biāo)準(zhǔn)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
spark rdd轉(zhuǎn)dataframe 寫入mysql的實(shí)例講解
今天小編就為大家分享一篇spark rdd轉(zhuǎn)dataframe 寫入mysql的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
MYSQL數(shù)據(jù)表基本操作之創(chuàng)建+查看+修改+刪除操作方法
本文將介紹如何在MySQL數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)表的創(chuàng)建、查看、修改和刪除操作,并討論一些常見的注意事項(xiàng)及防止誤操作的策略,通過(guò)這些基礎(chǔ)操作,您將能夠更高效地進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)和管理工作,感興趣的朋友一起看看吧2025-04-04
解決Navicat查詢到的數(shù)據(jù)不能修改問(wèn)題
文章主要討論了在Navicat中查詢到的數(shù)據(jù)不能修改的幾種可能原因,包括表是只讀、權(quán)限不夠、表沒(méi)有設(shè)置主鍵以及使用了GROUP BY查詢導(dǎo)致的數(shù)據(jù)不是原來(lái)表里的數(shù)據(jù)2025-11-11
mysql 無(wú)限級(jí)分類實(shí)現(xiàn)思路
關(guān)于該問(wèn)題,暫時(shí)自己還沒(méi)有深入研究,在網(wǎng)上找到幾種解決方案,各有優(yōu)缺點(diǎn)。2011-08-08
mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)
MySQL 中的 FIND_IN_SET 函數(shù)用于在逗號(hào)分隔的字符串列表中查找指定字符串的位置,本文就來(lái)介紹一下mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)2024-08-08
MySQL常用客戶端工具的用途和詳細(xì)說(shuō)明
MySQL是一個(gè)廣泛使用的開源關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),它為開發(fā)者和數(shù)據(jù)庫(kù)管理員提供了一套完整的客戶端工具和功能,這篇文章主要介紹了MySQL常用客戶端工具的用途和詳細(xì)說(shuō)明的相關(guān)資料,需要的朋友可以參考下2025-09-09

