使用MySQL JSON查詢篩選嵌套字段的值方式
在日常開發(fā)中,隨著項(xiàng)目需求的不斷復(fù)雜化,許多表字段可能會(huì)存儲(chǔ) JSON 格式的數(shù)據(jù)。
例如,我們有一張site_device表,其中有一個(gè)名為detail的字段,保存了設(shè)備的詳細(xì)信息。這些信息存儲(chǔ)為 JSON 數(shù)據(jù),如下所示:
{
"deviceType": "ammeter",
"techParams": {
"name": "202501241556",
"deviceNo": "202501241556",
"gatewayNo": "1829047495952388098",
"ownership": "top",
"dataReport": "1"
},
"deviceBrand": "HUAWEI",
"deviceModel": "test",
"modelConfigId": "1871021778273325058"
}我們想要查詢出 ownership 為 top 的設(shè)備。ownership 字段嵌套在 techParams 中,因此我們需要使用 MySQL 提供的 JSON 函數(shù)來實(shí)現(xiàn)查詢。
1. 理解 JSON 數(shù)據(jù)的層級結(jié)構(gòu)
在這個(gè)例子中,JSON 的結(jié)構(gòu)可以分解為:
deviceType:在 JSON 頂層。techParams:是一個(gè)嵌套對象,里面包含了ownership等字段。ownership:目標(biāo)字段,位于techParams內(nèi)。
我們需要從 detail 中提取出 techParams.ownership 的值。
2. 使用 MySQL JSON 查詢函數(shù)
MySQL 提供了一系列函數(shù)用于處理 JSON 數(shù)據(jù):
JSON_EXTRACT(json_doc, path):從 JSON 中提取值。JSON_UNQUOTE(json_val):去掉 JSON 提取值的引號,返回純文本。
對于本例來說,我們可以用以下語句來篩選出 ownership 為 top 的記錄:
SELECT * FROM site_device WHERE JSON_UNQUOTE(JSON_EXTRACT(detail, '$.techParams.ownership')) = 'top';
語法解釋
JSON_EXTRACT(detail, '$.techParams.ownership')
提取 detail 中 techParams 對象內(nèi)的 ownership 值。
JSON_UNQUOTE(...)
去掉 JSON 提取結(jié)果的引號,使其變?yōu)槠胀ㄗ址?/p>
WHERE ... = 'top'
篩選出 ownership 值等于 top 的記錄。
3. 示例數(shù)據(jù)和運(yùn)行結(jié)果
假設(shè) site_device 表中的數(shù)據(jù)如下:
| id | detail |
|---|---|
| 1 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
| 2 | {"deviceType": "ammeter", "techParams": {"ownership": "bottom", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
| 3 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
運(yùn)行查詢后,結(jié)果為:
| id | detail |
|---|---|
| 1 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
| 3 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
4. 注意事項(xiàng)
JSON 路徑表達(dá)式 $
JSON 路徑表達(dá)式 $ 表示 JSON 的根,嵌套字段用 . 分隔。例如:$.techParams.ownership。
性能優(yōu)化
如果數(shù)據(jù)量較大,可以通過為 JSON 字段創(chuàng)建虛擬列(Generated Column)并加索引來提升查詢性能。
ALTER TABLE site_device ADD COLUMN ownership VARCHAR(50) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(detail, '$.techParams.ownership'))) STORED, ADD INDEX idx_ownership (ownership);
數(shù)據(jù)規(guī)范化
如果 JSON 數(shù)據(jù)中的字段經(jīng)常被查詢,考慮將這些字段拆分到獨(dú)立的數(shù)據(jù)庫列中,以提高查詢效率。
5. 總結(jié)
MySQL 提供了強(qiáng)大的 JSON 查詢功能,使得我們可以方便地處理結(jié)構(gòu)化的 JSON 數(shù)據(jù)。在本文中,我們通過 JSON_EXTRACT 和 JSON_UNQUOTE 函數(shù),成功篩選出了目標(biāo)字段值為特定值的記錄。同時(shí),結(jié)合性能優(yōu)化建議,可以讓你的 JSON 查詢更高效。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
sql如何使用group by分組,同時(shí)查詢其它字段
文章介紹了使用SQL的GROUP BY進(jìn)行分組查詢時(shí)的一些規(guī)則和技巧,主要強(qiáng)調(diào)了在SELECT后面的字段要么是聚合函數(shù)的一部分,要么必須包含在GROUP BY子句中,此外,文章還討論了如何在GROUP BY時(shí)查詢其他字段,通過使用MAX或MIN函數(shù)來實(shí)現(xiàn)2024-12-12
MySQL自定義序列數(shù)的實(shí)現(xiàn)方式
這篇文章主要介紹了MySQL自定義序列數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
MySQL之使用UNION和UNION ALL合并兩個(gè)或多個(gè)SELECT語句的結(jié)果集
這篇文章主要介紹了MySQL之使用UNION和UNION ALL合并兩個(gè)或多個(gè)SELECT語句的結(jié)果集,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
linux 安裝 mysql 8.0.19 詳細(xì)步驟及問題解決方法
這篇文章主要介紹了linux 安裝 mysql 8.0.19 詳細(xì)步驟,本文給大家列出了常見問題及解決方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
MySQL中如何進(jìn)行SQL調(diào)優(yōu)舉例詳解
這篇文章主要介紹了SQL調(diào)優(yōu)的幾種方法,包括合理設(shè)計(jì)索引,避免SELECT*,避免在SQL中進(jìn)行函數(shù)計(jì)算等操作,避免使用%LIKE,注意聯(lián)合索引需滿足最左匹配原則,不要對無索引字段進(jìn)行排序操作,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
淺談選擇mysql存儲(chǔ)引擎的標(biāo)準(zhǔn)
本文介紹了如何選擇mysql存儲(chǔ)引擎,從存儲(chǔ)引擎的介紹、幾個(gè)常用引擎的特點(diǎn)三個(gè)方面進(jìn)行講解,感興趣的小伙伴們可以參考一下2015-07-07

