在where条件中用“分隔换行

时间:2019-12-11 16:42:55

标签: javascript node.js postgresql orm sequelize.js

我在数据库中有一个JSONB列。

我想向数据库发出请求,我可以在其中检查此JSON中的某些值是对还是错:

SELECT *
FROM table
WHERE ("json_column"->'data'->>'data2')::boolean = true AND id = '00000000-1111-2222-3333-456789abcdef'
LIMIT 1

所以,我的续集请求:

const someVariableWithColumnName = 'data2';
Model.findOne({
  where: {
    [`$("json_column"->'data'->>'${someVariableWithColumnName}')::boolean$`]: true,
    id: someIdVariable,
  },
  order: [/* some order, doesn't matter */],
})

续集会产生类似以下的不良结果

SELECT *
FROM table
WHERE "(json_column"."->'data'->>'data2')::boolean" = true AND id = '00000000-1111-2222-3333-456789abcdef'
LIMIT 1

通过.拆分我的列,并将"添加到每个元素。

有什么想法可以摆脱在何处条件下向列中添加"的情况?

编辑: 这是我对sequelize.literal()的查询:

const someVariableWithColumnName = 'data2';
    Model.findOne({
      where: {
        [sequelize.literal(`$("json_column"->'data'->>'${someVariableWithColumnName}')::boolean$`)]: true,
        id: someIdVariable,
      },
      order: [/* some order, doesn't matter */],
    })

2 个答案:

答案 0 :(得分:0)

您可以使用Sequelize.literal()来避免虚假引号。恕我直言,将json处理包装在db函数中也可能会有帮助。

答案 1 :(得分:0)

我刚刚遇到了一个类似的用例。

我相信您可以将静态 sequelize.where 方法与 sequelize.literal 结合使用。

这是 sequelize API 参考中的相应文档:https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#static-method-where 这是常规文档中的一个示例(尽管我承认很难找到): https://sequelize.org/master/manual/model-querying-basics.html#advanced-queries-with-functions--not-just-columns-

最后,对于您的特定坐姿,请尝试以下操作:

const someVariableWithColumnName = 'data2';
Model.findOne({
  where: {
[Op.and]: [
  // We provide the virtual column sql as the first argument of sequelize.where with sequelize.literal.
  // We provide the matching condition as the second argument of sequelize.where, with the usual sequelize syntax.
  sequelize.where(sequelize.literal(`$("json_column"->'data'->>'${someVariableWithColumnName}')::boolean$`), { [Op.eq]: true }),
  { id: someIdVariable }
]
})