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 - 不区分大小写的主要内容,如果未能解决你的问题,请参考以下文章

为啥 mysql 区分大小写

mysql常用命令区分大小写吗

oracle11g中的sql语句区分大小写吗

请问mysql数据类型是不是区分大小写?

mysql 字段值不区分大小写

如何查看mysql表名字段是不是区分大小写