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