Sequelize:WHERE LIKE 子句中的 Concat 字段

Posted

技术标签:

【中文标题】Sequelize:WHERE LIKE 子句中的 Concat 字段【英文标题】:Sequelize: Concat fields in WHERE LIKE clause 【发布时间】:2015-12-21 13:18:12 【问题描述】:

我正在为我正在处理的 node.js 项目使用 sequelize ORM。我有一个查询,我需要对多列的连接结果执行类似的操作。

例如,如下所示:

SELECT * FROM People WHERE (CONCAT(firstname, ' ', lastname)) LIKE '%John Do%'。

我正在使用以下语法,并且想知道这是否可行,而不必求助于使用 RAW 查询(这在我的解决方案中没有其他地方)。

   var criteria = 
        include: [
            occupation
        ],
        where: 
            is_active: 1
        ,
        nest: false
    ;

    db.people.findAll(criteria, ).then(function(people) 
        success(people);
    ).catch(function(err) 
        error(err);
    );

有什么想法吗?

【问题讨论】:

【参考方案1】:
db.models.users.findOne( 
            where: 
                [db.sequelize.Op.and]: [
                    db.sequelize.where(
                        db.sequelize.fn('CONCAT', db.sequelize.col('first_name'), ' ', db.sequelize.col('last_name')), 
                         like: `%$name%` ,
                    ),
                     status: 'ACTIVE' ,
                ]
            
        );

【讨论】:

【参考方案2】:

我能够使用基于@yjimk 答案的新续集版本 5.21.13 来实现这一点。

Users.findAll(
  where: 
    [sequelize.Op.or]:
     namesQuery: sequelize.where(
      sequelize.fn(
        "concat",
        sequelize.col("firstName"),
        " ",
        sequelize.col("lastName")
      ),
      
        [sequelize.Op.like]: `%$req.body.query%`,
      
    ),
    email: [sequelize.Op.like]: `%$req.body.query%`,
    companyName: [sequelize.Op.like]: `%$req.body.query%`,
  
)

【讨论】:

太棒了。工作。【参考方案3】:

受@code-jaff 启发,但您需要在名字和姓氏之间连接一个空格字符串才能使其正常工作。否则它只会返回 'JohnDoe' 而不是 'John Doe'。这是代码。

  Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), 
    like: '% John Doe %'
  )

为了给那些可能不明白这适合您的查询的地方的人提供一些上下文,这是上面代码在 where 或语句中的示例。 req.body.query 是您发布的变量搜索词。

Users.findAll(
  where: 
    $or: [
      Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), 
        like: '%' + req.body.query + '%'
      ),
         email:  $like: '%' + req.body.query + '%'  ,
         companyName:  $like: '%' + req.body.query + '%'  
    ]
  
)

Sequelize 4.0 更新

基于字符串的运算符(上例中的$like$or)已被弃用,取而代之的是基于符号的运算符。这对安全来说是件好事

见:http://docs.sequelizejs.com/manual/tutorial/querying.html#operators

这些运算符将替换为[Sequelize.Op.like][Sequelize.Op.or]。还有其他方法可以在您的文档中突出显示的续集选项中配置它

【讨论】:

我必须将 Sequelize.where 中的 like 替换为 [Sequelize.Op.like] 才能正常工作。【参考方案4】:

你需要这样的东西

var criteria = 
    where: Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstname"), Sequelize.col("lastname")), 
        like: '%John Do%'
    )

注意:未经测试

Original source

【讨论】:

以上是关于Sequelize:WHERE LIKE 子句中的 Concat 字段的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize - 使用 MariaDB 的 where 子句中的地理位置

使用 sequelize 包含列的 where 子句

sequelize 嵌套包含 where 子句

Sequelize - 在 where 子句中查询其他表

使用 Node 和 sequelize 关联对象的 Where 子句

在子查询中续集“WHERE”子句