MySQL JSON:根據鍵值搜尋物件
MySQL 表通常使用 JSON 欄位來儲存複雜的資料結構。使用 JSON 時,常見的任務是根據鍵值對檢索特定物件。然而,直接查找物件可能並不總是那麼簡單。
JSON 架構範例:
考慮以下架構:
CREATE TABLE `fields` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`label` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
`options` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
範例資料:
INSERT INTO `fields` (label, options) VALUES
(
'My Field',
'[{"text": "Grass", "value": "1"}, {"text": "Synthetic (New Type - Soft)", "value": "2"}, {"text": "Synthetic (Old Type - Hard)", "value": "3"}, {"text": "Gravel", "value": "5"}, {"text": "Clay", "value": "6"}, {"text": "Sand", "value": "7"}, {"text": "Grass/Synthetic Mix", "value": "8"}]'
);
問題:
假設我們要從選項 JSON 數組中檢索字串“Grass”,知道其對應的“值”是“1”。單獨使用 JSON_EXTRACT() 需要數組的索引,這可能不容易取得。
解決方案1:使用JSON_SEARCH() 和可怕的字串操作
這種方法結合JSON_SEARCH() 部分查找索引,然後從字串中刪除不需要的部分:
SELECT
JSON_EXTRACT(`options`,CONCAT('$[',REPLACE(REPLACE(JSON_SEARCH(`options`, 'one', '1'), '"$[', ''), '].value"', ''), '].text'))
from `fields`;
解決方案2:使用JSON_TABLE()
MySQL 8.0 引入了JSON_TABLE() 來簡化此任務:
select field_options.* from fields cross join
json_table(fields.options,
'$[*]' columns(
text text path '$.text',
value text path '$.value'
)
) as field_options
where field_options.value = 1;
替代方法:關聯式資料模型
對於像本範例這樣的更簡單的資料結構,請考慮將資料儲存在關係表中,其中列為鍵和值對,允許直接搜尋:
SELECT * FROM field_options WHERE value = '1';
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3