在数据处理中,JSON以其灵活的结构备受青睐。KingbaseES提供强大的JSON处理能力,支持JSON和JSONB两种类型。本文将深入解析三大类JSON操作函数,助你轻松玩转半结构化数据!
JSONB_TO_RECORD
/ JSON_TO_RECORD
SELECT * FROM jsonb_to_record('{"id":1,"name":"Kingbase"}')
AS t(id INT, name TEXT);
-- 结果:id | name
-- 1 | Kingbase
NULL
。JSONB_TO_RECORDSET
/ JSON_TO_RECORDSET
SELECT * FROM jsonb_to_recordset('[{"score":90},{"score":85}]')
AS t(score INT);
-- 结果:score
-- 90
-- 85
JSONB_POPULATE_RECORD
CREATE TYPE user_type AS (age INT, city TEXT);
SELECT jsonb_populate_record(
(NULL::user_type),
'{"age":25,"city":"北京","tel":"10086"}'
);
-- 结果:age | city
-- 25 | 北京
值提取
直接映射JSON字段到列:
SELECT * FROM JSON_TABLE(
'{"dept":"IT","staff":[{"name":"王强"},{"name":"李娜"}]}',
'$.staff[*]' COLUMNS (
name TEXT PATH '$.name'
)
);
-- 结果:name
-- 王强
-- 李娜
存在性检查
快速判断字段是否存在:
SELECT * FROM JSON_TABLE(
'{"email":"[email protected]"}',
'$' COLUMNS (
has_phone BOOLEAN EXISTS PATH '$.phone'
)
);
-- 结果:has_phone → false
嵌套展开
多层JSON一键扁平化:
SELECT * FROM JSON_TABLE(
'{"order_id":1001,"items":[{"product":"A","qty":2}]}',
'$' COLUMNS (
order_id INT PATH '$.order_id',
NESTED PATH '$.items[*]' COLUMNS (
product TEXT PATH '$.product',
qty INT PATH '$.qty'
)
)
);
-- 结果:order_id | product | qty
-- 1001 | A | 2
连接策略
通过PLAN
子句控制数据关联方式:
PLAN (OUTER (UNION)) -- 左外连接+并集
PLAN (INNER (CROSS)) -- 内连接+笛卡尔积
**
,明确层级路径。-- 错误:类型不匹配
SELECT jsonb_to_record('{"price":"99.5"}') AS t(price INT);
-- 正确:字符串→数字需显式转换
SELECT jsonb_to_record('{"price":"99.5"}') AS t(price NUMERIC);
函数类别 | 适用场景 | 特点 |
---|---|---|
TO_RECORD(SET) |
简单字段提取 | 语法简洁 |
POPULATE_RECORD |
预定义数据结构 | 支持默认值 |
JSON_TABLE |
复杂JSON解析、多层级展开 | 功能最强大 |
掌握这些函数,无论是日志解析、配置管理还是接口数据存储,都能游刃有余!立即体验KingbaseES,释放JSON数据潜能吧!
(注:本文示例基于KingbaseES V9,实际使用请参考最新版本文档)