PostgreSQL中如何获取jsonb字段audio下的最后一个随机键
查询JSONB字段中audio节点的最后一个键
现有如下JSONB字段内容,其中audio节点下的键为随机值(无法预先知晓具体返回值),请问能否查询出audio节点下的最后一个键(示例中为"2814462280")?
{ "test": { "audio": { "1175828715": { "direction": "outbound" }, "2814462280": { "direction": "inbound" } } } }
可以实现,以下是针对PostgreSQL的具体方案:
方案1:按键的数值排序取最后一个(适用于键为数字字符串的场景)
如果audio下的键都是字符串类型的数字,先提取所有键,转成数值类型排序后取最后一个:
SELECT key AS last_audio_key FROM your_table, jsonb_object_keys(json_data->'test'->'audio') AS key ORDER BY key::numeric DESC LIMIT 1;
方案2:按插入顺序取最后一个(PostgreSQL 12+适用)
从PostgreSQL 12开始,jsonb会保留键的插入顺序。可以用jsonb_each()结合WITH ORDINALITY获取键的顺序索引,再取索引最大的键:
SELECT key AS last_audio_key FROM your_table, jsonb_each(json_data->'test'->'audio') WITH ORDINALITY AS j(key, val, idx) ORDER BY idx DESC LIMIT 1;
注意事项
- PostgreSQL 12之前的版本不保留jsonb键的插入顺序,此时只能按键的自然排序结果取最后一个
- 若键是数字字符串,务必转成数值类型排序,否则字符串排序逻辑会导致结果不符合预期(比如"100"会排在"20"前面)
内容的提问来源于stack exchange,提问作者rwehresmann
相关产品推荐
相关产品推荐

