PostgreSQL如何正确提取jsonb列中存储的周一打卡时间值
问题核心原因
之前的查询无法得到预期结果,根源是PostgreSQL jsonb操作符的使用和取值层级匹配错误:
- 操作符使用不当:
->> 'Monday'会直接把Monday对应的整个json对象(包含checkin、checkout的结构)序列化为纯文本输出,无法拆分得到两个独立的时间字段 - 取值层级不足:没有穿透到Monday节点下的子属性层,没法单独提取checkin、checkout的具体值
修正后的可执行SQL
原本的拆分数组逻辑(jsonb_array_elements(daysprofile) as dayp)是正确的,只需要修正取值链路,逐层穿透到目标字段即可:
SELECT name, dayp -> 'days' -> 'Monday' ->> 'checkin' AS monday_checkin, dayp -> 'days' -> 'Monday' ->> 'checkout' AS monday_checkout FROM attendanceprofile, jsonb_array_elements(daysprofile) as dayp;
输出结果说明
对照样例json结构,上述查询会返回两个独立的结构化时间字段:
- 周一签到时间:
7:00 - 周一签退时间:
18:00
可选优化:如果需要过滤掉未配置周一考勤规则的无效行,避免输出空值记录,可在查询末尾增加过滤条件:
WHERE dayp -> 'days' -> 'Monday' IS NOT NULL
内容的提问来源于stack exchange,提问作者Benjamin Y
相关产品推荐
相关产品推荐

