【问题标题】:Convert MySQL "where" to Sequelizejs "where"将 MySQL "where" 转换为 Sequelizejs "where"
【发布时间】:2019-08-06 06:53:39
【问题描述】:

我试图编写“WHERE (CASE ... THEN ... ELSE ... END) > 0”来续集 v3.33,但还没有找到解决方案。

试过 sequelize.literal('...') 但没有用。 使用“HAVING”是一种解决方案,但它对大数据提取的性能没有好处,而且速度要慢一倍。

这只是 MySQL 代码的一个示例,但与我想要实现的目标非常接近。

SELECT
(CASE `a`.`fee` IS NULL 
  THEN `a.b`.`fee` 
  ELSE `a`.`fee`
END) AS `_fee`
FROM `a`
WHERE
(CASE `a`.`fee` IS NULL 
  THEN `a.b`.`fee` 
  ELSE `a`.`fee`
END) > 0 AND 
(created_at > currentDate 
  AND 
created_at < futureDate)

我想将其转换为续集。以下是我所能做到的,我不知道如何添加案例关闭。

models.a.findAll({
  ...
  where: {
    created_at: { $gt: startDate, $lt: endDate }
  }
})

*** 不要介意 created_at,这只是一个例子。

【问题讨论】:

    标签: javascript mysql sequelize.js


    【解决方案1】:

    您可以为此使用sequelize.wheresequelize.literal

    where:{
        $and : [
            { created_at: { $gt: startDate, $lt: endDate } },
            sequelize.where(sequelize.literal('(CASE `a`.`fee` IS NULL THEN `a.b`.`fee` ELSE `a`.`fee` END)') , { $gt : 0 } )
        ]
    } 
    

    注意:这可能不适用于别名 a。表的可能有差异,您可以根据查询进行调试和更改

    【讨论】:

    • 虽然我的代码没有像我预期的那样工作,因为我的查询仍然有点偏离,但这段代码工作!它完全按照我想要的方式生成 SQL。只是想知道,在生成的 SQL 中有 (( )) 双花括号围绕 CASE 像 ((CASE...END) &gt; 0) 有什么区别我不知道,因为我的查询还没有工作。谢谢!已接受答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多