96

我正在尝试根据用户选择的数量来选择产品的不同价格。这是我正在处理的查询(它有语法错误):

 select id, 
    (SELECT 
    IF(qty_1<='23',price,1)
    ELSEIF(('23'>qty_1 && qty_2<='23'),price_2,1)
    ELSEIF(('23'>qty_2 && qty_3<='23'),price_3,1)
    ELSEIF('23'>qty_3,price_4,1)
    END IF) as total 
 from product;
4

5 回答 5

239

你有你在这样的存储过程中使用的东西作为参考,但它们不打算像你现在那样使用。您可以使用IF如图所示duskwuff。但是Case声明对眼睛更好。像这样:

select id, 
    (
    CASE 
        WHEN qty_1 <= '23' THEN price
        WHEN '23' > qty_1 && qty_2 <= '23' THEN price_2
        WHEN '23' > qty_2 && qty_3 <= '23' THEN price_3
        WHEN '23' > qty_3 THEN price_4
        ELSE 1
    END) AS total
 from product;

这看起来更干净。我想你无论如何都不需要内在SELECT..

于 2012-12-15T01:06:26.750 回答
24

IF()在 MySQL 中是三元函数,而不是控制结构——如果第一个参数中的条件为真,则返回第二个参数;否则,它返回第三个参数。没有对应的ELSEIF()函数或END IF关键字。

与您所拥有的最接近的是:

IF(qty_1<='23', price,
  IF('23'>qty_1 && qty_2<='23', price_2,
    IF('23'>qty_2 && qty_3<='23', price_3,
      IF('23'>qty_3, price_4, 1)
    )
  )
)

这些条件对我来说并不是全部都有意义(看起来其中一些可能会无意中颠倒过来?),但是在不知道你到底想要完成什么的情况下,我很难解决这个问题。

于 2012-12-14T23:33:28.357 回答
10

当使用嵌套的 if() 函数时,我在 MySQL 5.1.72 中发现了一个错误......列变量的值(例如 qty_1)在第二个 if() 中为空白,使其无用。请改用以下构造:

case 
  when qty_1<='23' then price
  when '23'>qty_1 && qty_2<='23' then price_2
  when '23'>qty_2 && qty_3<='23' then price_3
  when '23'>qty_3 then price_4
  else 1
end
于 2014-03-04T22:55:48.227 回答
4

对于您的问题:

SELECT id, 
   IF(qty_1 <= '23', price,
   IF(('23' > qty_1 && qty_2 <= '23'), price_2,
   IF(('23' > qty_2 && qty_3 <= '23'), price_3,
   IF(('23' > qty_2 && qty_3<='23'), price_3,
   IF('23' > qty_3, price_4, 1))))) as total 
FROM product;

您可以使用 MySQL 中的if - else控制结构或IF函数。

参考:
http ://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/

于 2017-02-25T12:00:46.977 回答
2

根据 Nawfal 的回答,IF 语句需要在一个过程中。我发现这篇文章展示了一个在程序中使用您的脚本同时仍在开发和测试的绝妙示例。基本上,您创建、调用然后删除该过程:

https://gist.github.com/jeremyjarrell/6083251

于 2016-03-21T22:33:38.073 回答