MySQL 的 JSON 查詢

MySQL 的 JSON 路徑格式

MySQL 使用特定的 JSON 路徑表達式語法來導航和提取 JSON 文檔中的數據

基本結構

MySQL 中的 JSON 路徑遵循以下通用格式

$[路徑組件]

路徑組件詳解

| 操作符       | 描述      | 示例                  |
| ----------- | --------- | --------------------- |
| $           | 根對象     | $                    |
| . 或 []     | 成員訪問   | $.name 或 $['name']   |
| [*]         | 數組通配符 | $.items[*]            |
| [n]         | 數組索引   | $[0]                 |
| [m to n]    | 數組范圍   | $[1 to 3]            |
| **          | 遞歸通配符 | $**.price             |

1. 根對象 ($)

  • $ 表示整個 JSON 文檔

2. 成員訪問 (.[])

  • 點號表示法:$.store.book
  • 括號表示法:$['store']['book']
  • 當鍵名包含特殊字符或空格時使用括號表示法

3. 數組訪問

  • 所有元素:$[*]$.array[*]
  • 指定索引:$[0] 計數是從0開始
  • 范圍:$[1 to 3](MySQL 8.0.26+)

4. 通配符

  • * 匹配當前層級所有成員/元素
  • ** 遞歸搜索所有路徑(MySQL 8.0.26+)

特殊語法元素

1. 過濾表達式 (MySQL 8.0.4+)

$.items[?(@.price > 10)]
  • ? 引入過濾表達式
  • @ 表示當前元素

2. 路徑范圍 (MySQL 8.0.26+)

$[1 to 3]       // 第1到第3個元素
$[last-1]       // 倒數第二個元素
$[last-2 to last] // 最后三個元素

實際示例

簡單路徑

-- 提取標量值
SELECT JSON_EXTRACT('{"name": "張三", "age": 30}', '$.name');-- 數組元素, 輸出 "b", 注意是帶雙引號的
SELECT JSON_EXTRACT('["a", "b", "c"]', '$[1]');

復雜路徑

-- 嵌套對象
SELECT JSON_EXTRACT('{"store": {"book": {"title": "MySQL指南"}}}', '$.store.book.title');-- 對象數組
SELECT JSON_EXTRACT('{"items": [{"id": 1}, {"id": 2}]}', '$.items[*].id');

簡寫操作符

MySQL 提供常用操作的簡寫形式

  • -> : 等同于 JSON_EXTRACT()
  • ->> : 等同于 JSON_UNQUOTE(JSON_EXTRACT())
-- 以下兩種寫法等價:
SELECT json_column->'$.name';
SELECT JSON_EXTRACT(json_column, '$.name');-- 以下兩種寫法等價(返回去除引號的字符串):
SELECT json_column->>'$.name';
SELECT JSON_UNQUOTE(JSON_EXTRACT(json_column, '$.name'));

注意

  1. 路徑表達式區分大小寫
  2. 不存在的路徑返回 NULL(不會報錯)
  3. ** 遞歸操作符可能影響性能
  4. 過濾表達式支持比較運算符:=!=<>

MySQL 的 JSON_TABLE 函數

使用過 JSON_EXTRACT 函數都知道, 這樣獲取的結果還不是真正的行列結構, MySQL 8.0 引入的 JSON_TABLE 函數可以將 JSON 數據轉換為關系型表格格式, 將數組中的每個元素轉換成表格中的一行數據.

JSON_TABLE 的功能

  1. 將 JSON 數組展開為多行記錄
  2. 提取嵌套的 JSON 對象屬性
  3. 將半結構化數據轉為結構化數據

JSON_TABLE 用法

JSON_TABLE(json_doc,       -- JSON 類型的字段或值path_expression -- JSON 路徑表達式COLUMNS(        -- 新表的列定義column_name column_type PATH json_path [on_empty] [on_error],...)
) [AS] alias

參數說明

  1. json_doc:可以是 JSON 字符串字面量, 或者表中的 JSON 類型列
  2. path_expression:指向要展開的 JSON 數組的路徑
  3. COLUMNS:定義輸出列的結構
    • column_name:生成的列名
    • column_type:數據類型(如 VARCHAR, INT, JSON 等)
    • PATH:指定數據提取路徑
  4. alias:必須提供的表別名

實際案例

將整數數組展開為一列多行

SELECT *
FROM JSON_TABLE('[1, 2, 3]','$[*]' COLUMNS(rowid FOR ORDINALITY,value INT PATH '$')
) AS t;

輸出

rowid | value
------+-------
1     | 1
2     | 2
3     | 3

將對象數組展開為多列多行

SELECT *
FROM JSON_TABLE('[{"name":"張三","age":25},{"name":"李四","age":30}]','$[*]' COLUMNS(name VARCHAR(20) PATH '$.name',age INT PATH '$.age',adult VARCHAR(3) PATH '$.age' DEFAULT '否' ON EMPTY)
) AS t;

輸出

name | age | adult
-----+-----+------
張三 | 25  | 否
李四 | 30  | 否

在數據表中展開

如果JSON是表中的一個字段, 可以使用 table_1 CROSS JOIN JSON_TABLE(...) 展開, 例如一個表 v_video 的字段 result 為 JSON 字段, 需要展開 result 中的一個成員 sequences, 寫成SQL如下

SELECT e.id,e.match_id,e.result->>'$.id' AS json_id,j.tag->>'$.sf' AS sf_value,j.tag->>'$.ef' AS ef_value,j.tag->>'$.ef' - j.tag->>'$.sf'AS duration
FROM v_video eCROSS JOIN JSON_TABLE(e.result->'$.sequences','$[*]' COLUMNS (tag JSON PATH '$')) AS j ON e.match_id = 294

上面的SQL, 通過 CROSS JOIN JSON_TABLE 將每一行 e.result 字段下的 sequences 數組展開, 每個數組元素成為新字段 tag, 這時候還是一個 JSON, 然后在SELECT 中通過->>抽取其中的值, 得到完全展開的一個新表.

高級用法

FOR ORDINALITY 子句

生成自增的行號列

COLUMNS(id FOR ORDINALITY,...
)

嵌套路徑處理

COLUMNS(NESTED PATH '$.nested_obj' COLUMNS(sub_col1 INT PATH '$.prop1',sub_col2 VARCHAR(10) PATH '$.prop2')
)

上面的例子用嵌套可以改寫為

SELECT j.id,j.sf,j.ef,j.ef - j.sf AS duration
FROM v_video e
CROSS JOIN JSON_TABLE(e.result->'$.sequences','$[*]' COLUMNS (id FOR ORDINALITY,NESTED PATH '$' COLUMNS(ef INT PATH '$.ef',sf INT PATH '$.sf'))) AS j ON e.match_id = 294

上面的SQL, 通過 NESTED PATH ... COLUMNS(...) 將展開后數組中的一個JSON元素進一步展開為多個字段.

錯誤處理

COLUMNS(ef INT PATH '$.ef' NULL ON EMPTY NULL ON ERROR,sf INT PATH '$.sf' DEFAULT '0' ON EMPTY NULL ON ERROR
)

格式是

on_empty:{NULL | DEFAULT json_string | ERROR} ON EMPTYon_error:{NULL | DEFAULT json_string | ERROR} ON ERROR

注意事項

  1. MySQL 版本要高于8.0
  2. 路徑表達式必須指向 JSON 數組, 注意是數組
  3. 必須為結果集指定別名
  4. 在 FROM 子句和 JOIN 子句中都可以使用
  5. 在性能上, 對大數據集使用 JSON_TABLE 可能較慢, 可以為 JSON 列創建函數索引提高查詢性能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75767.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Wi-SUN技術,強勢賦能智慧城市構筑海量IoT網絡節點

在智慧城市領域中&#xff0c;當一個智慧路燈項目因信號盲區而被迫增設數百個網關時&#xff0c;當一個傳感器網絡因入網設備數量爆增而導致系統通信失效時&#xff0c;當一個智慧交通系統因基站故障而導致交通癱瘓時&#xff0c;星型網絡拓撲與蜂窩網絡拓撲在構建廣覆蓋與高節…

Leetcode13-羅馬數字轉整數

題目鏈接&#xff1a;13. 羅馬數字轉整數 - 力扣&#xff08;LeetCode&#xff09; 如同上一題&#xff0c;直接用暴力法破解&#xff0c;簡單好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…

Linux系統加固筆記

檢查口令為空的賬戶 判斷依據&#xff1a;存在則不符合 特殊的shell a./bin/false:將用戶的shell設置為/bin/false&#xff0c;用戶會無法登錄&#xff0c;并且不會有任何提示信息b./sbib/nologin&#xff1a;nologin會禮貌的向用戶發送一條消息&#xff0c;并且拒絕用戶登錄…

23種設計模式-責任鏈(Chain of Responsibility)設計模式

責任鏈設計模式 &#x1f6a9;什么是責任鏈設計模式&#xff1f;&#x1f6a9;責任鏈設計模式的特點&#x1f6a9;責任鏈設計模式的結構&#x1f6a9;責任鏈設計模式的優缺點&#x1f6a9;責任鏈設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是…

【宇宙回響】從Canvas到MySQL:飛機大戰的全棧交響曲【附演示視頻與源碼】

?? 這是星際大戰系列的第三篇,感謝一路以來支持和關注這個項目的每一位朋友! ?? 文章力求嚴謹,但難免有疏漏之處,歡迎各位朋友指出,讓我們一起在交流中進步。 ?? 項目代碼、文檔和相關資源都可以免費獲取,希望能幫助到更多對游戲開發感興趣的朋友。 ?? 如果您有任…

MyBatis-Plus(Ⅵ)插件

目錄 一、分頁插件 1.添加配置類 2.在測試類測試 結果 二、xml實現分頁的自定義 1.UserMapper中定義接口方法 2.創建UserMapper.xml文件 3.在測試類測試 結果 三、樂觀鎖 1.場景 2.樂觀鎖與悲觀鎖 3.模擬修改沖突 數據庫中添加商品表 添加數據 添加實體類 添加map…

火山引擎云上實戰: DeepSeek R1 大模型(全尺寸)

本文將介紹兩種在火山引擎云上部署 DeepSeek-R1 全尺寸模型服務的方案&#xff0c;涵蓋大模型推理服務的 Terraform 一鍵部署、容器化部署、資源彈性伸縮和模型可觀測。 來源 | 火山引擎云基礎 在 AI 大模型日新月異的當下&#xff0c;企業在使用大模型時往往面臨著數據隱私保…

vue遺漏的知識點(動態組件.)

----動態組件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的內置組件&#xff0c;用于動態渲染其他組件。:is 屬性 用于指定要渲染的組件。它的值可以是&#xff1a; 組件的名稱&#xff08;字符串&#xf…

工作流引擎Flowable介紹及SpringBoot整合使用實例

Flowable簡介 Flowable 是一個輕量級的業務流程管理&#xff08;BPM&#xff09;和工作流引擎&#xff0c;基于 Activiti 項目發展而來&#xff0c;專注于提供高性能、可擴展的工作流解決方案。它主要用于企業級應用中的流程自動化、任務管理和審批流等場景。 Flowable 的核心…

【uni-app】引用公共組件

目錄 一、建立公共組件 1.1新建vue文件 1.2編寫公共文件代碼 1.3使用 注意事項 一、建立公共組件 1.1新建vue文件 在公共組件文件目錄下新建所需要的功能文件 1.2編寫公共文件代碼 按需求寫對應功能的代碼 1.3使用 在需要使用的文件下引用公共組件 注意事項 想要使用s…

STL中vector模擬實現

vector各個接口函數 //構造函數 vector() vector(size_t n,const T& valT()) vector(int n,const T& val T()) //拷貝構造函數 vector(const vector<T>& v) //迭代器版本的 vector(inputiterator first, inputiterator end) //賦值運算符重載 vector<T&…

DML 數據操縱語言學習筆記

一、DML 核心概念體系 1.1 語言定位與邊界 DML&#xff08;Data Manipulation Language&#xff09;作為 SQL 三大核心語言之一&#xff0c;專注于數據行級操作&#xff0c;區別于 DDL&#xff08;結構定義&#xff09;和 DCL&#xff08;權限控制&#xff09;。其核心指令包…

springboot的跨域是什么?遇到跨域問題如何解決?

在Spring Boot中&#xff0c;跨域是指當瀏覽器中的前端應用&#xff08;如運行在某個域名和端口下的前端頁面&#xff09;請求后端接口時&#xff0c;如果后端接口所在的域名、端口或協議與前端應用不一致&#xff0c;瀏覽器會阻止這種跨域請求。這是由于瀏覽器的同源策略&…

嘯叫抑制(AFS)從算法仿真到工程源碼實現-第八節-系統搭建

一、概述 系統分為錄音模塊、數據處理模塊、播音模塊。錄音模塊和播音模塊使用alsa庫進行讀寫數據。各模塊為獨立進程處理&#xff0c;模塊之間使用命名管道進行數據的傳輸。數據處理模塊我們使用基于頻域的自適應濾波去嘯叫算法。 二、工程實現 2.1 系統流程圖 2.2 錄音模塊…

HTML——什么是塊級元素,什么是內聯元素,有何區別

在 HTML 中&#xff0c;塊級元素&#xff08;Block-level element&#xff09;和內聯元素&#xff08;Inline element&#xff09;是兩種不同類型元素&#xff0c;它們在頁面布局和樣式應用方面有不同的行為和特性。 塊級元素&#xff08;Block-level element&#xff09; 塊級…

01 設計模式和設計原則

類設計原則&#xff1a; 單一職責原則&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;&#xff1a;實現類要職責單一開閉原則&#xff08;Open Close Principle&#xff0c;OCP&#xff09;&#xff1a;對擴展開放&#xff0c;對修改關閉里氏替換原則…

【踩坑日記】springboot 打包后實現類無法找到

試過了所有改什么目錄 依賴 clean都以失敗告終 最后將實現類的文件名從Impl改成impl宣布成功 記得使用idea自帶的重構

項目-蒼穹外賣(十五) WebSocket+語音播報功能實現(來訂單+催單)

一、介紹 二、入門案例 配置類&#xff1a; package com.sky.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter;/…

【Spring篇】Spring的生命周期

一、Bean 生命周期的核心階段 1. 實例化&#xff08;Instantiation&#xff09; ? 觸發時機&#xff1a;容器啟動時&#xff08;單例 Bean&#xff09;或請求時&#xff08;原型 Bean&#xff09;。 ? 實現方式&#xff1a; 通過反射&#xff08;Class.newInstance() 或構造…

Redis、Memcached應用場景對比

環境 Redis官方網站&#xff1a; Redis - The Real-time Data Platform Redis社區版本下載地址&#xff1a;Install Redis | Docs Memcached官方網站&#xff1a;memcached - a distributed memory object caching system Memcached下載地址&#xff1a;memcached - a dis…