使用MySQL從JSON字符串提取數(shù)據(jù)的方法詳解
1. 背景知識
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,易于閱讀和編寫,同時也易于機(jī)器解析和生成。MySQL 從版本 5.7 開始支持 JSON 數(shù)據(jù)類型,使得在數(shù)據(jù)庫中存儲和操作 JSON 數(shù)據(jù)成為可能。
在許多應(yīng)用中,JSON 字符串可能存儲在表的某個字段中,我們需要提取和轉(zhuǎn)換這些數(shù)據(jù)以便進(jìn)行進(jìn)一步分析或展示。
2. 示例數(shù)據(jù)
假設(shè)我們在 wf_lcdy
表中有一個字段 lct
,其中存儲了如下 JSON 字符串:
{"15775d64e52c4ba3a8eef4bafc5f40e5":"875 162","75b67fab657748a9ab4bba141bfa0d36":"375 98","428299fd90814b3eaf129e8246f82b2a":"155 126"}
我們希望將其轉(zhuǎn)換為以下格式的數(shù)組:
[{"id":"15775d64e52c4ba3a8eef4bafc5f40e5","x":875,"y":162},{"id":"75b67fab657748a9ab4bba141bfa0d36","x":375,"y":98},{"id":"428299fd90814b3eaf129e8246f82b2a","x":155,"y":126}]
3. SQL 查詢分析
以下是實(shí)現(xiàn)這一轉(zhuǎn)換的 SQL 查詢:
SELECT CONCAT('[', GROUP_CONCAT( CONCAT( '{"id":"', SUBSTRING_INDEX(SUBSTRING_INDEX(kv, ':', 1), '"', -1), '", "x":', CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(kv, ':', -1), ' ', 1) AS UNSIGNED), ', "y":', CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(kv, ':', -1), ' ', -1) AS UNSIGNED), '}' ) ), ']') AS result FROM ( SELECT TRIM(BOTH '"' FROM kv) AS kv FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(lct, '{', ''), '}', ''), '"', ''), ',', numbers.n), ',', -1) AS kv FROM wf_lcdy JOIN ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 ) numbers WHERE CHAR_LENGTH(lct) - CHAR_LENGTH(REPLACE(lct, ',', '')) >= numbers.n - 1 AND ID = '0c86346993d64d98ad17892974bf8963' ) AS temp ) AS kv_pairs;
3.1 查詢結(jié)構(gòu)解析
內(nèi)層查詢:
- 去除多余字符:首先,使用
REPLACE
函數(shù)將lct
字段中的{
、}
和"
去掉。這樣可以簡化后續(xù)處理。 - 分割字符串:使用
SUBSTRING_INDEX
將每個鍵值對分割開。我們通過一個數(shù)字表(1到10)來實(shí)現(xiàn)。數(shù)字表的作用是幫助我們迭代處理每個鍵值對,因?yàn)槲覀儫o法預(yù)先知道 JSON 中鍵值對的數(shù)量。
- 去除多余字符:首先,使用
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(lct, '{', ''), '}', ''), '"', ''), ',', numbers.n), ',', -1) AS kv
這段代碼將 JSON 字符串拆分為多個鍵值對,
kv
列中將包含這樣的值,例如:15775d64e52c4ba3a8eef4bafc5f40e5:875 162
75b67fab657748a9ab4bba141bfa0d36:375 98
428299fd90814b3eaf129e8246f82b2a:155 126
中層查詢:
- 在此查詢中,我們會對
kv
列進(jìn)行進(jìn)一步處理。使用TRIM(BOTH '"' FROM kv)
去掉多余的引號,以確保后續(xù)操作不會受到影響。
- 在此查詢中,我們會對
SELECT TRIM(BOTH '"' FROM kv) AS kv
- 外層查詢:
- 聚合和格式化:在外層查詢中,我們使用
GROUP_CONCAT
聚合所有的kv
對,并使用CONCAT
生成目標(biāo)格式的 JSON 字符串。 - 提取數(shù)據(jù):使用
SUBSTRING_INDEX
提取id
、x
和y
的值,并將它們轉(zhuǎn)換為相應(yīng)的格式。這里的關(guān)鍵在于分割字符串并提取數(shù)字。
- 聚合和格式化:在外層查詢中,我們使用
GROUP_CONCAT( CONCAT( '{"id":"', SUBSTRING_INDEX(SUBSTRING_INDEX(kv, ':', 1), '"', -1), '", "x":', CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(kv, ':', -1), ' ', 1) AS UNSIGNED), ', "y":', CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(kv, ':', -1), ' ', -1) AS UNSIGNED), '}' ) )
- 最終結(jié)果:最終的結(jié)果將是一個字符串,格式為 JSON 數(shù)組。
4. 查詢結(jié)果
運(yùn)行上述查詢后,您將得到所需的結(jié)果格式:
[{"id":"15775d64e52c4ba3a8eef4bafc5f40e5","x":875,"y":162},{"id":"75b67fab657748a9ab4bba141bfa0d36","x":375,"y":98},{"id":"428299fd90814b3eaf129e8246f82b2a","x":155,"y":126}]
5. 性能考慮
- 字符長度計(jì)算:
CHAR_LENGTH(lct) - CHAR_LENGTH(REPLACE(lct, ',', ''))
的計(jì)算用于確保我們只處理存在的鍵值對。此方法對性能有一定影響,特別是對于大文本。 - 數(shù)字表的使用:由于 JSON 的結(jié)構(gòu)可能變化,數(shù)字表的使用可以擴(kuò)展以支持更多的鍵值對。在實(shí)際應(yīng)用中,您可以根據(jù)需要增加數(shù)字的范圍。
6. 總結(jié)
通過上述 SQL 查詢,我們成功地從一個包含 JSON 字符串的字段中提取了數(shù)據(jù)并轉(zhuǎn)換成了另一種結(jié)構(gòu)化格式。這種方法展示了 MySQL 在處理 JSON 數(shù)據(jù)方面的靈活性和強(qiáng)大能力。
在實(shí)際應(yīng)用中,您可以根據(jù)具體的需求對查詢進(jìn)行適當(dāng)?shù)男薷模赃m應(yīng)不同結(jié)構(gòu)的 JSON 數(shù)據(jù)。此外,了解 SQL 中字符串處理和聚合函數(shù)的使用,對于提升數(shù)據(jù)處理的能力和效率至關(guān)重要。希望本篇文章對您在處理 JSON 數(shù)據(jù)時有所幫助!
以上就是使用MySQL從JSON字符串提取數(shù)據(jù)的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL JSON提取數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
CentOS7環(huán)境下MySQL8常用命令小結(jié)
在進(jìn)行MySQL的優(yōu)化之前必須要了解的就是MySQL的查詢過程,下面這篇文章主要給大家介紹了關(guān)于CentOS7環(huán)境下MySQL8常用命令的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06mysql 強(qiáng)大的trim() 函數(shù)
這篇文章主要介紹了mysql 強(qiáng)大的trim() 函數(shù)使用方法,需要的朋友可以參考下2014-03-03數(shù)據(jù)從MySQL遷移到Oracle 需要注意什么
將數(shù)據(jù)從MySQL遷移到Oracle,大家需要注意什么?Oracle移植到mysql,又需要注意什么?如何有效解決移植過程的問題,為了數(shù)據(jù)庫的兼容性我們又該注意些什么?感興趣的小伙伴們可以參考一下2016-11-11一次mysql遷移的方案與踩坑實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次mysql遷移的方案與踩坑的相關(guān)資料,MySQL遷移是DBA日常維護(hù)中的一個工作,遷移究其本義,無非是把實(shí)際存在的物體挪走,保證該物體的完整性以及延續(xù)性,需要的朋友可以參考下2021-08-08MySQL用戶權(quán)限設(shè)置保護(hù)數(shù)據(jù)庫安全
MySQL用戶權(quán)限設(shè)置是保護(hù)數(shù)據(jù)庫安全的重要措施之一。通過為用戶設(shè)置不同的權(quán)限,可以控制用戶對數(shù)據(jù)庫的訪問能力,包括讀取、修改、刪除、創(chuàng)建等操作。合理設(shè)置用戶權(quán)限可以避免誤操作、非法訪問等安全問題2023-05-05