Sequelize - 不区分大小写
Posted
技术标签:
【中文标题】Sequelize - 不区分大小写【英文标题】:Sequelize - case-insensitive like 【发布时间】:2017-06-03 08:08:45 【问题描述】:如何在 Sequelize 中实现这一点?
SELECT * FROM table where lower(column) LIKE ('abcd%');
我找不到将 lower 函数与 $like
混合使用的方法【问题讨论】:
我了解到,在 mysql 中,您不需要在列上调用lower()
。 Like
隐含地是不区分大小写的搜索。如果不是 utf8
,则 YMMV 取决于您的排序规则/字符集。
【参考方案1】:
我遇到了类似的问题并解决了
const values = ['adcd'].map(x => x.toLowerCase());
const results = await SomeModel.findAll(
attributes: [
...Object.keys(SomeModel.rawAttributes),
[Sequelize.fn('LOWER', Sequelize.col('someColumn')), 'lower'],
],
having: lower: values, ,
);
【讨论】:
【参考方案2】:你应该使用 Sequelize.Op :
Table.findAll(
where:
name:
[Sequelize.Op.iLike]: searchQuery
)
如果您想进行部分查询,请不要忘记在您的 searchQuery 之前或之后添加 %。
See the docs here
【讨论】:
FWIW,MySQL 不支持 ILIKE 这仅适用于 PG【参考方案3】:我找到了解决办法:
Table.findAll(
attributes: ['createdAt', 'col'],
where:
$and:[
createdAt:
$between:[minDate, maxDate]
,
Sequelize.where(
Sequelize.fn('lower', Sequelize.col('col')),
$like: 'abcd%'
)
]
);
【讨论】:
解决方案是什么? % 符号? 解决方案是where()
和fn()
之间的组合
那么新方法是什么...“未处理的拒绝错误:对where: 'raw query'
的支持已被删除。” ?就像 SQL 中的许多“稍微先进但并不可怕”的事情一样,其中 Sequelize 混合在一起,我发现只是旋转并长时间执行它最终会变慢,但在回顾代码 6 个月或时更具可读性和可维护性一年后。 :\
我不得不在 col 方法中添加表名(在相应模型中定义):Sequelize.col('table.col')
【参考方案4】:
如果您使用 PostGres,则可以使用 $iLike 运算符搜索行(不是您的问题所要求的列名)。
Sequelize Docs
虽然它没有完全解决您的问题,但希望它可以帮助那些搜索不区分大小写 + Sequelize 的人,这将我带到这里。
Table.findAll(
where:
createdAt:
$between: [minDate, maxDate]
,
someOtherColumn:
$like: '%mysearchterm%'
)
【讨论】:
以上是关于Sequelize - 不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章