MySQL查詢JSON數(shù)組字段包含特定字符串的方法
問(wèn)題背景
在MySQL數(shù)據(jù)庫(kù)中,當(dāng)某個(gè)字段存儲(chǔ)的是JSON數(shù)組(如["噴繪","2.6m噴繪","M噴繪","直噴","雙透","氣模"]
),需要查詢數(shù)組中包含特定字符串(如’氣模’)的記錄時(shí),傳統(tǒng)的LIKE
語(yǔ)句無(wú)法直接使用。本文介紹兩種高效的解決方案。
解決方案對(duì)比
1. 精確匹配方案(推薦)
當(dāng)需要完全匹配數(shù)組中的元素時(shí)(如精確查找"氣模"):
SELECT * FROM process_unit_prices WHERE process_name = '制圖' AND JSON_CONTAINS(craft_name, JSON_QUOTE('氣模')) LIMIT 1;
1.核心函數(shù):
JSON_QUOTE()
: 將字符串轉(zhuǎn)為JSON格式(如"氣模"
)JSON_CONTAINS()
: 檢查JSON數(shù)組中是否包含指定值
2.優(yōu)點(diǎn):效率高,精確匹配數(shù)組元素
3.注意:必須元素完全相等才會(huì)匹配(如"氣模車(chē)"
不會(huì)匹配)
2. 模糊匹配方案
當(dāng)需要部分匹配元素內(nèi)容時(shí)(如查找包含"氣模"子串的元素):
SELECT * FROM process_unit_prices WHERE process_name = '制圖' AND JSON_SEARCH(craft_name, 'one', '%氣模%') IS NOT NULL LIMIT 1;
1.核心函數(shù):
JSON_SEARCH()
: 搜索JSON中匹配模式的路徑'one'
: 找到第一個(gè)匹配即停止'%氣模%'
: SQL的LIKE通配符模式
2.優(yōu)點(diǎn):支持模糊匹配
3.注意:效率低于精確匹配,大數(shù)據(jù)量時(shí)需謹(jǐn)慎
參數(shù)化查詢示例
在MyBatis等ORM框架中使用(如Spring Boot項(xiàng)目):
<!-- 精確匹配 --> <select id="findProcess" resultType="ProcessPrice"> SELECT * FROM process_unit_prices WHERE process_name = #{processType} AND JSON_CONTAINS(craft_name, JSON_QUOTE(#{craft})) LIMIT 1 </select> <!-- 模糊匹配 --> <select id="findProcessFuzzy" resultType="ProcessPrice"> SELECT * FROM process_unit_prices WHERE process_name = #{processType} AND JSON_SEARCH(craft_name, 'one', CONCAT('%', #{craft}, '%')) IS NOT NULL LIMIT 1 </select>
使用場(chǎng)景建議
場(chǎng)景 | 推薦方案 | 示例 |
---|---|---|
分類標(biāo)簽匹配 | 精確匹配 | 工藝類型=[“雕刻”,“噴涂”] |
關(guān)鍵字搜索 | 模糊匹配 | 描述包含"緊急"的訂單 |
多值屬性過(guò)濾 | 精確匹配 | 顏色=[“紅”,“藍(lán)”] |
性能優(yōu)化貼士
索引優(yōu)化:MySQL 8.0+可為JSON字段創(chuàng)建函數(shù)索引
CREATE INDEX idx_craft ON process_unit_prices((CAST(craft_name AS CHAR(255))));
數(shù)據(jù)規(guī)范:若常需查詢,建議拆分為關(guān)系表
避免全模糊:%氣模%
無(wú)法使用索引,盡量用氣模%
經(jīng)驗(yàn)總結(jié):JSON字段查詢雖靈活,但需謹(jǐn)慎使用。精確匹配首選JSON_CONTAINS
,模糊需求再用JSON_SEARCH
,并注意性能影響。在數(shù)據(jù)設(shè)計(jì)階段評(píng)估是否真需JSON結(jié)構(gòu),關(guān)系表通常更高效。
知識(shí)擴(kuò)展
下面小編為大家整理了MYSQL 匹配查詢JSON字段的相關(guān)方法,希望對(duì)大家有所幫助
在 MySQL 中,如果你存儲(chǔ)的是 JSON 數(shù)據(jù),并且需要檢查某個(gè) JSON 字段是否包含一個(gè)特定的鍵值對(duì)(例如 {user1: 1}
),你可以使用 MySQL 提供的 JSON 函數(shù)來(lái)實(shí)現(xiàn)。
1. 使用 JSON_CONTAINS() 函數(shù)
JSON_CONTAINS()
函數(shù)可以檢查一個(gè) JSON 字段是否包含另一個(gè) JSON 值。該函數(shù)返回一個(gè)布爾值,如果第一個(gè)參數(shù)(JSON 數(shù)據(jù))包含第二個(gè)參數(shù)(查詢條件),則返回 1
,否則返回 0
。
示例查詢:
假設(shè)你的表結(jié)構(gòu)如下:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, user_data JSON );
你可以通過(guò) JSON_CONTAINS()
函數(shù)來(lái)檢查 JSON 字段是否包含 {user1: 1}
。
SELECT * FROM users WHERE JSON_CONTAINS(user_data, '{"user1": 1}');
這條 SQL 語(yǔ)句會(huì)返回所有 user_data
字段包含 {user1: 1}
鍵值對(duì)的記錄。
2. JSON_CONTAINS() 函數(shù)的使用細(xì)節(jié)
- 第一個(gè)參數(shù)是你要查詢的 JSON 字段。
- 第二個(gè)參數(shù)是你要查找的 JSON 數(shù)據(jù),必須是一個(gè)有效的 JSON 格式字符串。
- 該函數(shù)會(huì)檢查 JSON 字段中是否存在第二個(gè)參數(shù)所表示的鍵值對(duì)。
3. 查詢部分匹配
如果你只想檢查 JSON 字段中是否存在某個(gè)鍵(例如 user1
)并且該鍵的值是 1
,而不關(guān)心 JSON 字段中的其他內(nèi)容,你仍然可以使用 JSON_CONTAINS()
,但是需要確保第二個(gè)參數(shù)符合你想要的結(jié)構(gòu)。
SELECT * FROM users WHERE JSON_CONTAINS(user_data, '{"user1": 1}');
4. 檢查 JSON 字段中是否包含某個(gè)鍵
如果你不關(guān)心鍵值對(duì),只想檢查 JSON 字段中是否包含某個(gè)鍵(比如 user1
),可以使用 JSON_EXTRACT()
或 JSON_UNQUOTE()
與 IS NOT NULL
來(lái)實(shí)現(xiàn)。
SELECT * FROM users WHERE JSON_UNQUOTE(JSON_EXTRACT(user_data, '$.user1')) = '1';
JSON_EXTRACT(user_data, '$.user1')
提取user_data
字段中的user1
鍵的值。JSON_UNQUOTE()
去除引號(hào),使其返回一個(gè)普通值。- 比較提取的值是否等于
'1'
。
小結(jié)
JSON_CONTAINS()
:用于檢查 JSON 字段是否包含某個(gè)指定的鍵值對(duì)。JSON_EXTRACT()
+JSON_UNQUOTE()
:可以用來(lái)提取并比較 JSON 字段中的值。
使用 JSON_CONTAINS()
是檢查 JSON 數(shù)據(jù)是否包含某個(gè)完整鍵值對(duì)的簡(jiǎn)便方法。如果你需要更細(xì)粒度的查詢(如只關(guān)心鍵是否存在且其值為特定值),可以結(jié)合 JSON_EXTRACT()
和 JSON_UNQUOTE()
進(jìn)行操作。
到此這篇關(guān)于MySQL查詢JSON數(shù)組字段包含特定字符串的方法的文章就介紹到這了,更多相關(guān)MySQL查詢JSON字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL通過(guò)ibd文件恢復(fù)數(shù)據(jù)的操作過(guò)程
通常,在InnoDB存儲(chǔ)引擎下,一個(gè)表由三部分組成:數(shù)據(jù)字典(.frm文件)、表空間(.ibd文件)和日志文件,其中,.frm文件存儲(chǔ)了表的定義,.ibd文件存儲(chǔ)了表的數(shù)據(jù)和索引,本文給大家記錄一次MySQL通過(guò)ibd文件恢復(fù)數(shù)據(jù)的操作過(guò)程,需要的朋友可以參考下2024-10-10mysql連接數(shù)設(shè)置操作方法(Too many connections)
下面小編就為大家?guī)?lái)一篇mysql連接數(shù)設(shè)置操作方法(Too many connections)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03MySQL中DATE_FORMATE函數(shù)使用時(shí)的注意點(diǎn)
這篇文章主要介紹了MySQL中DATE_FORMATE函數(shù)使用時(shí)的注意點(diǎn),主要是針對(duì)其內(nèi)置的字符集使用時(shí)需要轉(zhuǎn)換而進(jìn)行說(shuō)明,需要的朋友可以參考下2015-05-05出現(xiàn)錯(cuò)誤mysql Table ''performance_schema...解決辦法
這篇文章主要介紹了解決出現(xiàn)錯(cuò)誤mysql Table 'performance_schema.session_variables' doesn't exist的相關(guān)資料,需要的朋友可以參考下2017-04-04