'SELECT'语句中的'IF'-根据列值选择输出值


685
SELECT id, amount FROM report

我需要的amountamount,如果report.type='P'-amount如果report.type='N'。如何将此添加到上面的查询中?

Answers:


1025
SELECT id, 
       IF(type = 'P', amount, amount * -1) as amount
FROM report

参见http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

此外,您可以处理条件为null的情况。如果为零:

SELECT id, 
       IF(type = 'P', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount
FROM report

该部分IFNULL(amount,0)表示当金额不为null时返回金额,否则返回0


5
我想知道使用IFNULL代替COALESCE是否有任何优势?
克里斯,

4
从MySQL源,我注意到聚结的2点的定义,一个具有2个参数,以及其他与参数列表,但IFNULL调用与2个参数的聚结sql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
菲利普Buccioni

2
如果报告类型不同于“ N”和“ P”,则答案是不正确的,请参见更好的“案例陈述”解决方案中的BadHorsie的评论。
Trygve

3
@Trygve问题是有两个条件的,想找一条IF语句,怎么了?
费利佩·布乔尼

2
@Felipe,答案不一定是100%正确,可能还有N和P以外的其他报告类型。在您的情况下,这可能会导致错误,如果报告类型(例如)为'E',则选择-amount。问题没有提及,但是是否还有其他报告类型,因此我删除了我的否决票。我只想在这些情况下进行防御性编程,因此请提请其他读者注意。
Trygve

255

使用case语句:

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`

5
@Evan:是的。为了清楚起见,我使用它们。并不是说它会影响任何东西。
mellamokb 2011年

3
我更喜欢ANSI标准语法而不是特定数据库的自定义语法。
Gordon Linoff 2014年

2
这是最好的解决方案,因为如果report.type有其他值,或者以后引入了新的report.type,则接受的答案解决方案不一定是合适的。这是说if report.type = 'P' use amount, otherwise use -amount for anything else。如果不是“ P”,则不会考虑类型。
BadHorsie

97
SELECT CompanyName, 
    CASE WHEN Country IN ('USA', 'Canada') THEN 'North America'
         WHEN Country = 'Brazil' THEN 'South America'
         ELSE 'Europe' END AS Continent
FROM Suppliers
ORDER BY CompanyName;

43
select 
  id,
  case 
    when report_type = 'P' 
    then amount 
    when report_type = 'N' 
    then -amount 
    else null 
  end
from table

15

最简单的方法是使用IF()。是的,Mysql允许您执行条件逻辑。IF函数采用3个参数:CONDITION,TRUE OUTCOME,FALSE OUTCOME。

所以逻辑是

if report.type = 'p' 
    amount = amount 
else 
    amount = -1*amount 

的SQL

SELECT 
    id, IF(report.type = 'P', abs(amount), -1*abs(amount)) as amount
FROM  report

如果所有数字均为+ ve,则可以跳过abs()


12
SELECT id, amount
FROM report
WHERE type='P'

UNION

SELECT id, (amount * -1) AS amount
FROM report
WHERE type = 'N'

ORDER BY id;

由于结果集是互斥的,因此我在这里更喜欢UNION ALL。
阿思

4

您也可以尝试

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.