You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按jsonb数组中指定local_id的published字段排序?

PostgreSQL 基于jsonb数组的用户筛选与指定元素排序方案

针对你需要筛选登录过local_id='3f46c949'应用的用户,并按该应用对应published字段排序的需求,提供两种无需新建关联表的可行方案:

方案一:使用jsonb_path_query_first精准提取排序字段

利用PostgreSQL的jsonb_path_query_first函数,直接定位数组中匹配指定local_id的元素并提取其published值,同时保留单条用户记录:

SELECT 
    u.*,
    jsonb_path_query_first(u.apps_last_accessed, '$[*] ? (@.local_id == "3f46c949")')->>'published' AS target_published
FROM 
    users u
WHERE 
    u.apps_last_accessed @> '[{"local_id":"3f46c949"}]'
ORDER BY 
    target_published DESC; -- 可根据需求改为ASC
  • 逻辑说明:WHERE子句通过@>运算符快速筛选出包含目标应用记录的用户;jsonb_path_query_first精准提取数组中第一个匹配local_id的元素的published值,作为排序依据,确保每个用户仅返回一行数据。

方案二:使用LATERAL子查询展开并过滤

通过LATERAL关联子查询展开jsonb数组,同时过滤出匹配local_id的元素,直接用该元素的published排序:

SELECT 
    u.*,
    app->>'published' AS target_published
FROM 
    users u,
    LATERAL jsonb_array_elements(u.apps_last_accessed) AS app
WHERE 
    app->>'local_id' = '3f46c949'
ORDER BY 
    target_published DESC; -- 可根据需求改为ASC
  • 逻辑说明:LATERAL子查询将每个用户的apps_last_accessed数组展开为行,WHERE子句过滤出仅包含目标local_id的行,最终每个符合条件的用户只会返回一条匹配的记录,避免了展开后多行的问题。

内容的提问来源于stack exchange,提问作者Archonic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:53:20