在 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 条件下用 " 续集换行列的主要内容,如果未能解决你的问题,请参考以下文章