我有一个带有JSONB字段的postgres表。
json
包含对象数组
| id | my_json_field |
-------------------------------------------------------
| 1234 | [{"id": 1, type: "c"}, {"id": 2, type: "v"}] |
| 1235 | [{"id": 1, type: "e"}, {"id": 2, type: "d"}] |
我需要通过json字段的type
键对表进行排序/过滤。
服务器接受id
,因此如果id=1
-我需要按"c","e"
排序,如果id=2
-要按"v","d"
我有下一个SQL:
LEFT JOIN LATERAL (
SELECT elem ->> 'type' AS my_value
FROM jsonb_array_elements(my_json_field) a(elem)
WHERE elem ->> 'id' = '1'
) a ON true
这会将my_value
字段添加到结果中,我可以使用它来对表格进行排序/过滤
这在控制台中工作正常,但我找不到使用Sequelize.js
我也欢迎其他解决方案,谢谢!
修改,完整查询:
SELECT my_value FROM "main_table" AS "main_table"
LEFT OUTER JOIN ( "table2" AS "table2"
LEFT OUTER JOIN "form_table" AS "table2->form_table" ON "table2"."id" = "table2->form_table"."table2_id")
ON "main_table"."id" = "table2"."main_table_id"
LEFT JOIN LATERAL (
SELECT elem ->> 'type' AS my_value
FROM jsonb_array_elements("table2->form_table".structure) a(elem)
WHERE elem ->> 'id' = '1'
) a ON TRUE
ORDER BY "my_value" DESC;
答案 0 :(得分:0)
您实际上并不需要关键字LATERAL
,因为如果您直接使用集合返回函数而不是在子选择中,则隐含该关键字。
以下内容应与您的查询执行相同的操作,并且不需要LATERAL关键字:
SELECT a.elem ->> 'type' as my_value
FROM "main_table"
LEFT JOIN "table2" ON "main_table"."id" = "table2"."main_table_id"
LEFT JOIN "form_table" AS "table2->form_table" ON "table2"."id" = "table2->form_table"."table2_id")
LEFT JOIN jsonb_array_elements("table2->form_table".structure) a(elem) on a.elem ->> 'id' = '1'
ORDER BY my_value DESC;
我还删除了外部联接周围的无用括号和别名,这些别名没有为表提供新名称以简化语法。
也许允许您将查询与ORM(又称为“混淆层”)一起使用