【问题标题】:Sequelize : How to check if a substring exists in a tableSequelize:如何检查表中是否存在子字符串
【发布时间】:2019-11-04 23:49:01
【问题描述】:

有没有办法检查一个特定的字符串是否存在于表的列中?

例如,我有一个表 'fruits' 有两列,主键和fruit_name 以及后续行

1 apple
2 orange
3 pineapple

我有一个名为 apple_shake 的示例字符串。我需要检查这个 apple_shake 的子字符串是否存在。查询应返回包含“apple”的行

我知道如何在 mysql 查询中做到这一点 - SQL - Query to find if a string contains part of the value in Column

但是通过sequelize,following有问题

var sample_fruit_string = "apple_shake";
var gsp_config  = await model.fruit.findOne({where: {
    fruit_name: {
        [Op.like]: sample_fruit_string + '%'
    }
}});

【问题讨论】:

  • 你正在做"apple" LIKE "apple_shake%",但你想要相反:"apple_shake" LIKE "apple"。虽然我还不知道如何用sequelize.js 表达这一点。
  • 没错!我可以通过原始查询来做到这一点。但我无法通过 sequelize 模型进行查询。也许我应该直接使用查询而不是依赖模型?
  • 原始查询应该可以工作。另外,我认为您可以使用LOCATE() MySQL 函数来表达这一点——sequelize.js 支持函数,并且我认为您可以在上面的代码中将其表达为where: 表达式的一部分。对于COUNT(),示例如下所示:sequelize.fn('COUNT', sequelize.col('table_column_name')),您可能可以扩展它以使用LOCATE()。但我在这里猜想,没有真正体验过这个库。
  • 这不是 Sequelize 的问题,这种类型的查询用 SQL 是不可能的
  • @doublesharp 我不明白你为什么说不可能,看看这个 sqlfiddle:sqlfiddle.com/#!9/4c8192/2。我也担心效率问题,但不担心这种可能性。

标签: mysql node.js sequelize.js


【解决方案1】:

感谢@alx 我不知道可能的 SQL - 这就是您使用 Sequelize 生成适当 SQL 的方式。请注意,这对于大型数据集可能效率不高。

const sample_fruit_string = "apple_shake"; 

const gsp_config = await model.fruit.findOne({
  attributes: ['id'],
  where: Sequelize.where(
      Sequelize.fn('LOCATE', Sequelize.col('fruit_name'), sample_fruit_string),
      Sequelize.Op.ne,
      0
  ),
  logging: true,
});

生成以下内容:

SELECT `id` FROM `fruit` AS `fruit` WHERE LOCATE(`fruit_name`, 'apple_shake') != 0 LIMIT 1;

【讨论】:

  • 太棒了!奇迹般有效。虽然不确定性能。我从来不知道事情会这么复杂。找到超字符串很简单,但找到子字符串非常困难
【解决方案2】:

Sequelize has a substring operator 可以直接用来解决这个问题。

var sample_fruit_string = "apple_shake";
var gsp_config  = await model.fruit.findOne({where: {
    fruit_name: {
        [Op.substring]: sample_fruit_string // LIKE '%sample_fruit_string%'
    }
}});

【讨论】:

    【解决方案3】:
    var sample_fruit_string = "apple_shake";
    var gsp_config  = await model.fruit.findOne({where: {
    fruit_name: {
        [Op.like]: `%${sample_fruit_string}%` // LIKE '%sample_fruit_string%'
       //  [Op.ilike]: `%${sample_fruit_string}%` // For case sensitive searching
       // [Op.substring]: sample_fruit_substring  // Has been depreciated in future version of sequelize.
    }
    }});
    

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多