【问题标题】:Query case insensitive with Sequelize in Node using MariaDB database使用 MariaDB 数据库在 Node 中使用 Sequelize 查询不区分大小写
【发布时间】:2019-11-20 09:47:37
【问题描述】:

我是 Sequelize 的新手,经过大量挖掘后,我找不到同时使用 LOWERLIKE 编写查询的方法。

我想写这样的东西:

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;

有什么帮助吗?

【问题讨论】:

  • <snide-remark>注意 SQL 比它的 3rd 方表示更简洁?</snide-remark>

标签: node.js mariadb sequelize.js


【解决方案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
});

【讨论】:

    【解决方案2】:

    可能你根本不需要LOWER

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

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

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

    具体

    问题在于表定义中的COLLATE utf8_bin

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

    【讨论】:

    • 排序规则在 MySQL 中有效,但如果在 Linux 上运行,则在 MariaDB 中无效:/ 我试过了。
    • @JoubertVasconcelos - 哦???请提供SHOW CREATE TABLE acessories 和为SELECT 生成的SQL。 (我熟悉 MySQL 和 MariaDB,但不熟悉 Sequelize。如果 MySQL 和 MariaDB 在这方面有所不同,我会感到非常惊讶!)
    • 我编辑了问题以添加创建表指令。请确定,mariaDB 在 Linux 中区分大小写,但在 Windows 中不区分大小写:mariadb.com/kb/en/library/identifier-case-sensitivity
    • 他们在自己的 Jira 板中有一张未处理的票,要求使用此功能:jira.mariadb.org/browse/MCOL-495
    • @JoubertVasconcelos - 查看我添加的文本。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回答,但 ILIKE 仅适用于 Postgres,我正在使用 mariaDB。
    猜你喜欢
    • 2018-10-17
    • 2016-11-04
    • 1970-01-01
    • 2016-01-17
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多