MySQL IF ELSEIF在select查询中

Iva*_*los 66 mysql if-statement

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

 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;
Run Code Online (Sandbox Code Playgroud)

naw*_*fal 167

您拥有在此类存储过程中使用的内容以供参考,但它们并不打算像现在一样使用.您可以使用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;
Run Code Online (Sandbox Code Playgroud)

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

  • 是的确,它看起来更好,我会选择这个选项,但它有利于将来参考的两种方法..谢谢nawfal (2认同)

dus*_*uff 16

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)
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

这些条件对我来说都没有意义(看起来好像其中有些可能会无意中被逆转?),但不知道你究竟想要完成什么,我很难解决这个问题.


Dav*_*oke 6

我在使用嵌套的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
Run Code Online (Sandbox Code Playgroud)


小智 5

对于您的问题:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 尽管您的答案是 100% 正确,但如果该链接被移动、更改、合并到另一个链接或主站点消失,它也可能变得 100% 无用... **:-(** 因此,请[编辑]您的答案,并将链接中的相关步骤复制到您的答案中,从而保证您的答案在本网站的生命周期内 100% 有效! **;-)** 您可以随时将链接留在答案底部作为答案您的材料来源... (2认同)