使用MariaDB数据库在Node中使用Sequelize对查询不区分大小写

时间:2019-07-10 17:59:51

标签: node.js mariadb sequelize.js

我是Sequelize的新手,经过大量研究后,我找不到同时使用 LOWER LIKE 编写查询的方法。

我想写类似的东西:

SELECT * 
  FROM acessories
 WHERE LOWER(name) LIKE '%xyz%' 
    OR LOWER(description) LIKE '%xyz%'
 ORDER BY name

我写了这样的代码,但是我不能使用LOWER函数:

const getAcessories = await Acessories.findAndCountAll({
        limit,
        offset: start,
        order: [["name", "ASC"]],
        where: {
          [Sequelize.Op.or]: [
            {
              name: {
                [Sequelize.Op.like]: `%${search}%`
              },
              description: {
                [Sequelize.Op.like]: `%${search}%`
              }
            }
          ]
        }
      });

编辑:创建表命令:

从atm_usuarios中选择*;

CREATE TABLE `acessories` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `store` int(11) NOT NULL,
  `in_value` decimal(10,2) NOT NULL,
  `out_value` decimal(10,2) NOT NULL,
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `description` varchar(500) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime DEFAULT NULL,
  `deleted_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 collate=utf8_general_ci ROW_FORMAT=DYNAMIC;

有帮助吗?

3 个答案:

答案 0 :(得分:1)

查询的 where 子句可以在Sequelize.JS中编写如下:

const Utils = Sequelize.Utils;
const whereClause = {
    [Op.or]: [
        new Utils.Where(
            new Utils.Fn('LOWER', new Utils.Col('name')), {[Op.like]: `%${search}%`}
        ),
        new Utils.Where(
            new Utils.Fn('LOWER', new Utils.Col('description')), {[Op.like]: `%${search}%`}
        )
    ]
}

如果周围有一个Sequelize的实例,则还可以使用该实例上可用的静态方法来编写此代码:

const whereClause = {
    [Op.or]: [
        sequelize.where(
            sequelize.fn('LOWER', sequelize.col('name')), {[Op.like]: `%${search}%`}
        ),
        sequelize.where(
            sequelize.fn('LOWER', sequelize.col('description')), {[Op.like]: `%${search}%`}
        )
    ]
}

可以这样使用:

const getAcessories = await Acessories.findAndCountAll({
    limit,
    offset: start,
    order: [["name", "ASC"]],
    where: whereClause
});

答案 1 :(得分:0)

可能您根本不需要LOWER

如果列中的COLLATION是“不区分大小写的”,则只需进行测试即可,而无需使用LOWER()UPPER()

要查看排序规则(及其他内容),请使用SHOW CREATE TABLE

一种测试方法是尝试使用%xyz%%XYZ%。我预计两者都会给您相同的结果,因此您的排序规则不区分大小写。

特别是

问题出在表定义中的COLLATE utf8_bin

评论中的两个链接都不相关。一种是指“列存储”引擎,该引擎不专门用于表。另一个是指“标识符”名称-例如表和列名称,而不是列内容。

答案 2 :(得分:0)

也许您可以使用ILIKE?您可以查看文档并搜索ILIKE:http://docs.sequelizejs.com/manual/querying.html