首页 > 解决方案 > 在where子句中使用mysql函数时,MYSQL结果包含多行

问题描述

我有一个计算产品价格的存储过程(函数)。

这是我的功能:

CREATE DEFINER=`root`@`localhost` FUNCTION `getWinnerPriceByProductId`(
    `p_product_id` INT


)
RETURNS float
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    DECLARE v_winner_price FLOAT DEFAULT 0;
    DECLARE v_product_plan VARCHAR(255);

    SELECT ps.plan INTO v_product_plan FROM product_supplier ps WHERE ps.product_id = p_product_id AND ps.winner = 1;

    IF v_product_plan = 'Plan AB' THEN
        SELECT ps.wholesale_price INTO v_winner_price FROM product_supplier ps WHERE ps.product_id = p_product_id AND ps.winner = 1 LIMIT 1;
    ELSE
            SELECT ps.price INTO v_winner_price FROM product_supplier ps WHERE ps.product_id = p_product_id AND ps.winner = 1 LIMIT 1;
    END IF;

    RETURN v_winner_price;      
END

现在当我简单地调用这个函数时:

Select getWinnerPriceByProductId(1);

然后它返回正确的结果。

但是当我尝试在 where 子句中使用它时,例如:

SELECT * FROM products p where getWinnerPriceByProductId(p.id) BETWEEN 1 AND 100;

然后我收到一条错误消息:

结果包含多行。

如果结果由多行组成,那么调用函数时的情况与第一种情况不同吗?为什么只有当我在某些查询中使用该函数时才会发生这种情况?我在这里做错了什么?

标签: mysqlstored-proceduresstored-functions

解决方案


SELECT * FROM products where getWinnerPriceByProductId(p.id) BETWEEN 1 AND 100;

p.id是什么我们没有为此创建别名?您能否确保此 SP 在 1 列 getWinnerPriceByProductId(p.id) 上返回。


推荐阅读