使用jsonb_to_recordset函数报SQL错误42P01:表sometable缺少FROM子句条目
问题原因
你当前的SQL仅在jsonb_to_recordset函数参数中引用了sometable的data字段,但没有将sometable本身加入查询的FROM子句列表中,数据库无法识别sometable的引用来源,因此抛出42P01类的表不存在错误。
正确写法
基础写法(PostgreSQL 9.4+通用)
先将sometable加入FROM子句,再调用jsonb_to_recordset解析它的data字段:
SELECT t.id, t.city FROM sometable, jsonb_to_recordset(sometable.data) AS t(id int4, city varchar)
如果你的表名是大小写混合格式或包含特殊字符,需要保留原SQL的双引号包裹表名:
SELECT t.id, t.city FROM "sometable", jsonb_to_recordset("sometable".data) AS t(id int4, city varchar)
显式LATERAL写法(适配复杂查询场景)
如果你需要在查询中添加过滤条件、关联其他表,更推荐使用显式横向连接写法,逻辑更清晰:
SELECT t.id, t.city FROM "sometable" CROSS JOIN LATERAL jsonb_to_recordset("sometable".data) AS t(id int4, city varchar)
如果需要保留data字段为NULL、空数组的原表行,把CROSS JOIN LATERAL替换为LEFT JOIN LATERAL ... ON true即可:
SELECT t.id, t.city FROM "sometable" LEFT JOIN LATERAL jsonb_to_recordset("sometable".data) AS t(id int4, city varchar) ON true
内容的提问来源于stack exchange,提问作者rmmy
相关产品推荐
相关产品推荐

