2021-09-04 02:09:29
在SQL中解析JSON数据,主要通过数据库内置函数或操作符实现,将JSON字符串拆解为可操作的字段或表格。以下是详细步骤和常见方法,以MySQL和PostgreSQL为例:

提取值使用JSON_EXTRACT()函数或->操作符,路径以$开头表示根节点。
SELECT JSON_EXTRACT('{"name": "John", "age": 30}', '$.name'); -- 返回 "John"SELECT '{"name": "John", "age": 30}'->'$.age'; -- 返回 30更新值使用JSON_SET()函数修改字段值,生成新JSON文档。
SELECT JSON_SET('{"name": "John", "age": 30}', '$.age', 31); -- 返回 {"name": "John", "age": 31}删除键使用JSON_REMOVE()函数删除指定键。
SELECT JSON_REMOVE('{"name": "John", "age": 30}', '$.age'); -- 返回 {"name": "John"}展开数组MySQL 8.0+使用JSON_TABLE()将数组转为多行数据。
SELECT * FROM your_table,JSON_TABLE(your_table.json_column, '$[*]' COLUMNS ( id INT PATH '$.id', name VARCHAR(255) PATH '$.name')) AS jt;提取值使用->(返回JSON类型)和->>(返回文本类型)操作符。
SELECT '{"name": "John", "age": 30}'::json -> 'name'; -- 返回 "John" (json类型)SELECT '{"name": "John", "age": 30}'::json ->> 'name'; -- 返回 John (text类型)更新值使用jsonb_set()函数修改字段值。
SELECT jsonb_set('{"name": "John", "age": 30}'::jsonb, '{age}', '31'::jsonb); -- 返回 {"name": "John", "age": 31}删除键使用#-操作符删除指定键。
SELECT '{"name": "John", "age": 30}'::jsonb #- '{age}'; -- 返回 {"name": "John"}展开数组使用jsonb_array_elements()函数将数组转为多行。
SELECT value FROM your_table,jsonb_array_elements(your_table.json_column);MySQL路径支持多层级,例如$.address.city提取嵌套字段。
SELECT JSON_EXTRACT('{"address": {"city": "New York"}}', '$.address.city'); -- 返回 "New York"PostgreSQL通过链式操作符访问嵌套字段。
SELECT '{"address": {"city": "New York"}}'::json -> 'address' ->> 'city'; -- 返回 "New York"使用JSONB类型PostgreSQL中JSONB存储优化,查询效率更高。
创建索引对JSON字段的特定键创建索引,加速查询。
-- MySQL示例CREATE INDEX idx_name ON your_table((JSON_EXTRACT(json_column, '$.name')));避免全表扫描在WHERE子句中过滤数据,减少解析量。
SELECT * FROM your_table WHERE json_column->>'$.name' = 'John';优化SQL语句避免循环中解析JSON,优先使用批量操作。
路径错误
问题:路径不存在导致返回NULL。
解决:使用JSON验证工具检查结构,确保路径正确。
数据类型不匹配
问题:提取时未显式指定类型,如字符串转整数失败。
解决:在SQL中明确转换类型,例如CAST(json_column->>'$.age' AS INT)。
性能问题
问题:大量JSON解析导致查询慢。
解决:使用JSONB、创建索引、优化SQL语句。

SQL解析JSON的核心在于掌握数据库提供的函数和操作符:
关键步骤:

掌握这些方法后,可高效处理JSON数据,实现查询、过滤和排序等操作。