在 where 条件下用 " 续集换行列

Posted

技术标签:

【中文标题】在 where 条件下用 " 续集换行列【英文标题】:Sequelize wrap column with " in where condition 【发布时间】:2019-12-11 16:42:55 【问题描述】:

我在 DB 中有一个 JSONB 列。

我想向 DB 提出请求,我可以在其中检查此 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 */],
)

并 sequelize 产生不好的结果,例如:

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

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

知道如何避免在 where 条件下将 " 添加到列中吗?

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

使用 Sequelize.literal() 我得到了这样的结果: ...WHERE "[Object object]" = true AND... Sequelize.literal 需要一个字符串,而不是一个对象。希望我可以测试一下,但我们是 mysql 商店。也许如果你用 literal() 发布确切的代码? 我认为你应该删除字面量()周围的方括号 [].... 我无法删除 [] 因为它是对象中的关键【参考方案2】:

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

我相信您可以将静态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 
]
)

【讨论】:

以上是关于在 where 条件下用 " 续集换行列的主要内容,如果未能解决你的问题,请参考以下文章

在子数组上使用“where”和“in”时出现续集错误

有条件地续集allownull约束

续集关联 On 或 ON

使用可选参数对 Where 子句进行续集

续集如何查找具有多个 where 子句和时间戳的行 > NOW()

USB-C接口iPhone再出续集,小哥改良换接口工艺增加防水功能,还打算筹钱量产...