sql - Postgres 连接表数组 JSONB 列
问题描述
我在 bonuses.rules 中有一个包含此数据的字段:
[
{
"rule":{
"providers":[
"11",
"12",
]
}
}
]
“规则->提供者”的内容是数组。上面有一个例子。
我想通过 provider_games.provider_id 加入这些提供商。
这是我的查询,但返回的是空白结果。
SELECT bonuses.rules, bonuses.bonus_id, provider_games.provider_id
FROM bonuses
inner JOIN provider_games ON bonuses.rules -> '[{"rule": {"providers"}}]'
@> json_build_array (json_build_object ('provider_id', provider_games.provider_id)) :: jsonb
provider_games 表:
create table provider_games
(
provider_game_id bigserial not null
constraint provider_games_pkey
primary key
);
alter table provider_games owner to defaultdb;
奖金表:
create table bonuses
(
bonus_id bigserial not null
constraint bonuses_pkey
primary key,
rules jsonb
);
alter table bonuses owner to defaultdb;
解决方案
而不是JOIN
ing on a @>
,我建议对取消嵌套 json 的横向子查询进行连接:
SELECT bonuses.rules, bonuses.bonus_id, provider_games.provider_game_id
FROM bonuses,
LATERAL jsonb_array_elements(bonuses.rules) rules(obj),
LATERAL jsonb_array_elements_text(obj -> 'rule' -> 'providers') rule_provider(id)
INNER JOIN provider_games ON provider_games.provider_game_id = rule_provider.id::bigint;
(在线演示)
推荐阅读
- reactjs - 尝试从客户端连接时出现 WebSocket 问题
- javascript - 用玩笑模拟特定 url 上的 axios 请求
- javascript - 如何在我的代码中避免 Array-callback-return 错误
- flutter - 当单击 ListView 中的项目到 DetailsPage 时,如何加载不同的项目类?
- javascript - 仅使用 js 在移动设备上获取最精确位置的最佳方法
- mysql - 如何查找一整周从晚上 8 点到早上 6 点的数据
- javascript - HERE maps 使用 Bounds 获取基点
- github-actions - 编辑 GitHub 操作日志中未存储在官方操作机密中的文本的机密
- javascript - 是否可以以 GLTF 格式从场景中导出动画和变形?
- unity3d - 当我在统一上将平台切换到 android 时,Skybox 无法正确渲染?