如何在sequelize.js中嵌套SQL函数?

时间:2016-01-22 13:43:02

标签: javascript mysql sql sequelize.js

我使用Sequelize.JS连接到MySQL数据库。我有以下表结构:

products
---------------------
id INT
name VARCHAR
price DECIMAL
price_special DECIMAL

我希望获得最低price(或special_price,如果可用)和最高price(或special_price可用时)。使用原始SQL,我可以执行以下操作:

SELECT 
    MIN(IF(`price_special` > 0, `price_special`, `price`)) AS `min`, 
    MAX(IF(`price_special` > 0, `price_special`, `price`)) as `max` 
FROM 
    `products`
;

我也知道我可以在Sequelize中选择一个由SQL函数包装的列,这样:

product.findOne({
    attributes: [
        [ Sequelize.fn('MIN', Sequelize.col('price')), 'min' ],
        [ Sequelize.fn('MAX', Sequelize.col('price')), 'max' ],
    ]
});

但是,我不知道如何嵌套MINIF函数,就像我对原始SQL一样。

1 个答案:

答案 0 :(得分:1)

在发布我的问题后,我发现issue in GitHub有类似的问题。

我得到的解决方案如下:

product.findOne({
    attributes: [
        [ Sequelize.fn('MIN', Sequelize.fn('IF',
                Sequelize.literal('`price_special` > 0'),
                Sequelize.col('price_special'),
                Sequelize.col('price'))), 'min' ],
        [ Sequelize.fn('MAX', Sequelize.fn('IF', 
                Sequelize.literal('`price_special` > 0'), 
                Sequelize.col('price_special'), 
                Sequelize.col('price'))), 'max' ],
    ]
});

我个人不喜欢Sequelize.literal电话,但它正在运作,我不知道如何改进它。