【问题标题】:Similar string matching in Sequelize MYSQLSequelize MYSQL 中的类似字符串匹配
【发布时间】:2021-07-26 17:57:32
【问题描述】:

我是 Sequelize 和 JS 的新手,可能不知道所有运算符,所以我想问一下是否有任何方法可以从数据库中检索类似于但不完全匹配的条目。例如,我要搜索的字符串是+921234567890,但在数据库中它存储为+92-1234567890,并用连字符分隔国家/地区拨号代码。 我使用的数据库是 MySQL。 我试过这个,我知道这是不正确的,但我不确定如何继续:

 where: {
        cell: {
          [Op.or]: {
            [Op.like]: "%-%",
            [Op.eq]: cellNumber,
          },
        },

【问题讨论】:

  • 你能把你一直在尝试的代码放上来,这样可以得到更多的澄清
  • @Nithin-Techidiots ,我确实看到了它并使用了 like 运算符,但是我仍然需要匹配他们的数字
  • 这对于like 操作员来说并不是真正的任务。您最好将连字符添加到搜索字符串的适当位置并使用相等运算符。

标签: javascript mysql node.js sequelize.js


【解决方案1】:

这个问题的解决方案是使用原始 sql 查询解决的,但是对于在使用 REGEXP_REPLACE 时寻找答案的任何人,您应该使用 REPLACEsequelize.literal

cell: { [Op.eq]: this.sequelize.literal("REPLACE('cell','-','')") }

【讨论】:

  • 这不是您问题的最佳解决方案,我建议使用REGEX_REPLACE 和正则表达式。例如,您的代码只会删除连字符,但由于空格和括号的原因,在(415) 555-1234 这样的美国手机上会失败。
【解决方案2】:

在与您的输入进行比较之前,您可以使用REGEX_REPLACE() sql 函数替换cell 列中的任何非数字字符。使用sequelize.where()sequelize.fn()sequelize.col() 函数生成查询。假设您的表是model,模型是Model

const cellNumber = 1234567890;

const results = await Model.findAll({
  where: sequelize.where(
    sequelize.fn('REGEXP_REPLACE', sequelize.col('model.cell'), '[a-zA-Z]+', ''),
    '=',
    cellNumber
  ),
});

这应该生成类似于以下内容的 SQL:

SELECT * FROM `model`
WHERE REGEXP_REPLACE(`model`.`cell`, '[a-zA-Z]+', '') = 1234567890;

【讨论】:

  • 所以我最终解决了这个问题。将REGEXP_REPLACE 替换为REPLACE 后,我不再收到错误消息。不过还是谢谢你
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 2016-08-29
  • 2011-05-11
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多