我有一列 type JSONB
,其中每一行都包含一个带有对象数组的 JSON,例如:
[
{
"grade": "4.44/5",
"endYear": 2011,
"startYear": 2006,
"userId": "defg"
},
{
"grade": "9.133/10",
"endYear": 2010,
"startYear": 2006,
"userId": "abcd"
}
]
我正在尝试将这些JSONB
集合扩展为行,例如:
| grade | startYear | endYear | userId |
-------------------------------------------
| 4.44/5 | 2006 | 2011 | defg |
| 9.133/10 | 2006 | 2010 | abcd |
-------------------------------------------
..使用以下查询:
WITH arr AS (SELECT jsonb_array_elements(jsonbrecords) AS jsons
FROM "table-with-jsonb"),
lines AS (
SELECT x.*
FROM arr, jsonb_to_record(jsons) AS x(
"field1" VARCHAR
)
) SELECT *
FROM lines
我正在使用 Datagrip,它对结果进行分页,并且前 500 行的查询完成得很好。
但是,当我尝试加载结果的最后一页时,出现此错误:
[22023] ERROR: cannot call populate_composite on a scalar
谷歌搜索这个错误几乎没有显示任何有用的结果(对我来说是第一次),除了Postgres 源代码。
我不会说 C,但由于jsonb_array_elements
CTE 本身评估良好,我假设问题是某些行在jsonbrecords
column 中具有标量值,而不是适当的JSONB
.
为了确保我只有值,我删除了此查询JSONB
不包含的行:'{'
UPDATE "table-with-jsonb" SET jsonbrecords = NULL
WHERE jsonbrecords :: TEXT !~ '{'
这删除了大约十几行,但错误仍然存在。
我也试图通过检查JSONB
表中的原始行来找到问题,但什么也没找到。
我认为错误意味着一行中没有JSONB
值是正确的吗?如果是这样,我该如何解决?如果没有,我该如何调试?