MYSQL 在 where 子句中使用 mysql 函数时,结果多于一行
MYSQL Result consisted more than one row when using mysql function in where clause
我有一个计算产品价格的存储过程(函数)。
这是我的职能:
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);
那么它 returns 正确的结果。
但是当我尝试在 where 子句中使用它时,例如:
SELECT * FROM products p where getWinnerPriceByProductId(p.id) BETWEEN 1 AND 100;
然后我收到一条错误消息:
The Result Consisted more than one rows.
如果结果由多行组成,那么调用函数时的情况与第一种情况不一样吗?为什么只有当我在某些查询中使用该函数时才会发生这种情况?我在这里做错了什么?
SELECT * FROM products where getWinnerPriceByProductId(p.id) BETWEEN 1 AND 100;
什么是 p.id 我们没有为此创建别名?你能确保这个 SP return 在 1 列 getWinnerPriceByProductId(p.id).
目前没有创建函数的需求。一旦 OP 提供更多信息,将编辑此答案。
-- function can be replaced into simple join query
select case when ps.plan='Plan AB' then ps.wholesale_price else ps.price end as 'winner_price'
from product_supplier ps
join product p on ps.product_id=p.id
where ps.winner=1
and p.id=1; -- this is what you are parsing into the function
我有一个计算产品价格的存储过程(函数)。
这是我的职能:
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);
那么它 returns 正确的结果。
但是当我尝试在 where 子句中使用它时,例如:
SELECT * FROM products p where getWinnerPriceByProductId(p.id) BETWEEN 1 AND 100;
然后我收到一条错误消息:
The Result Consisted more than one rows.
如果结果由多行组成,那么调用函数时的情况与第一种情况不一样吗?为什么只有当我在某些查询中使用该函数时才会发生这种情况?我在这里做错了什么?
SELECT * FROM products where getWinnerPriceByProductId(p.id) BETWEEN 1 AND 100;
什么是 p.id 我们没有为此创建别名?你能确保这个 SP return 在 1 列 getWinnerPriceByProductId(p.id).
目前没有创建函数的需求。一旦 OP 提供更多信息,将编辑此答案。
-- function can be replaced into simple join query
select case when ps.plan='Plan AB' then ps.wholesale_price else ps.price end as 'winner_price'
from product_supplier ps
join product p on ps.product_id=p.id
where ps.winner=1
and p.id=1; -- this is what you are parsing into the function