Sequelize - 不区分大小写的 like

28

我该如何在Sequelize中实现这个?

SELECT * FROM table where lower(column) LIKE ('abcd%');

我找不到把lower函数和$like混合使用的方法。


2
我了解到在MySQL中,您不需要在列上调用lower()Like隐式地是一个不区分大小写的搜索。 如果它不是utf8,则可能会因您的排序/字符集而异。 - Ryan Shillington
此外,还要补充的是,在MySQL中,所有非二进制(varchar、text)字符串的比较都是完全不区分大小写的。 - undefined
4个回答

38

你应该使用 Sequelize.Op:

Table.findAll({
    where: {
        name: {
            [Sequelize.Op.iLike]: searchQuery
        }
    }
})

如果你想进行部分查询,请不要忘记在搜索查询(searchQuery)之前或之后添加百分号(%)。

在这里查看文档


5
MySQL不支持ILIKE。 - broofa
4
仅限PG使用。 - Hamza Hmem

26

我找到了解决方案:

Table.findAll({
  attributes: ['createdAt', 'col'],
  where: {
    $and:[
      {
        createdAt:{
          $between:[minDate, maxDate]
        }
      },
      Sequelize.where(
        Sequelize.fn('lower', Sequelize.col('col')),
        {
          $like: 'abcd%'
        }
      )
    ]
  }
});

解决方案是什么?百分号符号吗? - Travis Delly
解决方案是 where()fn() 的结合。 - Facundo Chambo
那么针对“Unhandled rejection Error: Support for {where: 'raw query'} has been removed.”,有什么新的解决方式呢?就像在Sequelize中涉及到许多“稍微高级但不是可怕的”SQL事物一样,我发现直接手动编写代码虽然速度较慢,但在6个月或一年后回顾代码时更易读和可维护。:\ - ChrisH
我不得不在col方法中添加表名(在相应的模型中定义): Sequelize.col('table.col') - Sylvain P

11

如果您正在使用PostGres,您可以使用$iLike运算符搜索行(而不是像您的问题要求的列名)。

Sequelize文档

虽然它没有完全回答您的问题,但希望它能帮助未来搜索大小写不敏感 + Sequelize 的人,这也是我来到这里的原因。

Table.findAll({
    where: {
        createdAt: {
            $between: [minDate, maxDate]
        },
        someOtherColumn: {
            $like: '%mysearchterm%'
        }
    }
})

0

我遇到了类似的问题,并通过以下方式解决:

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, },
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接