Sequelize.js postgres横向用法

时间:2019-05-08 11:32:34

标签: sql postgresql sequelize.js

我有一个带有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;

1 个答案:

答案 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(又称为“混淆层”)一起使用