我有一列 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
值是正确的吗?如果是这样,我该如何解决?如果没有,我该如何调试?
不相关,但是:您可以将查询简化为:
现在来回答实际问题。可以通过不
jsonb_to_record
单独使用和访问每个键来避免该错误:您并没有真正失去灵活性,因为您还需要指定列列表
jsonb_to_record()
。在线示例:http ://rextester.com/VVGJ34083
我已经想通了。问题出在特定的数据行中:
null
到底是破了jsonb_to_record
。一旦我删除它,一切正常。我不知道这是否会通过正常使用发生,但就我而言,我认为这是因为我从脚本将数据写入数据库
nodejs
,但不小心将目标列设置为 typeTEXT
而不是 typeJSONB
。我将类型更改为
JSONB
已包含数据的类型,因此null
必须以这种方式偷偷摸摸。