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

Mic*_*ael 664 mysql sql database

SELECT id, amount FROM report
Run Code Online (Sandbox Code Playgroud)

我需要amount成为amountif report.type='P'-amountif report.type='N'.如何将其添加到上述查询中?

Fel*_*oni 1003

SELECT id, 
       IF(type = 'P', amount, amount * -1) as amount
FROM report
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我想知道在这里使用IFNULL代替COALESCE是否有任何优势? (5认同)
  • 从mysql源代码中,我注意到2个coalesce定义,一个带有2个参数,另一个带有参数列表,但是ifnull用2个参数`sql/item_cmpfunc.h调用coalesce 722:Item_func_ifnull(Item*a,Item*b) :Item_func_coalesce(a,b){}` (4认同)
  • @Trygve问题是有两个条件的,并且在查找`IF`语句时,出了什么问题? (3认同)
  • 如果报表类型不同于“ N”和“ P”,则答案是不正确的,请参见更好的“案例陈述”解决方案中的BadHorsie的评论。 (2认同)
  • @Felipe,答案不一定是100%正确,可能还有N和P以外的其他报告类型。在您的情况下,这可能会导致错误,如果报告类型(例如)为'E',则选择-amount。问题没有提及,但是是否还有其他报告类型,因此我删除了我的否决票。我只想在这些情况下进行防御性编程,因此请提请其他读者注意。 (2认同)

mel*_*okb 245

使用case声明:

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`
Run Code Online (Sandbox Code Playgroud)

  • 这也适用于SQL Server(更通用的解决方案) (11认同)
  • @Evan:是的.我使用它们是为了清晰.并不是说无论如何它会影响任何东西 (5认同)
  • 我更喜欢ANSI标准语法而不是特定数据库的自定义语法. (3认同)
  • 这是最好的解决方案,因为如果report.type包含其他值,或者以后会引入新的report.type,则接受的答案解决方案不一定合适。这就是说,如果report.type ='P',则使用金额,否则将-amount用于其他内容。如果不是“ P”,则不会考虑类型。 (2认同)

小智 93

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


小智 40

select 
  id,
  case 
    when report_type = 'P' 
    then amount 
    when report_type = 'N' 
    then -amount 
    else null 
  end
from table
Run Code Online (Sandbox Code Playgroud)


aWe*_*per 14

最简单的方法是使用IF().是的Mysql允许你做条件逻辑.IF函数需要3个参数条件,真实的结果,错误的结果.

所以逻辑是

if report.type = 'p' 
    amount = amount 
else 
    amount = -1*amount 
Run Code Online (Sandbox Code Playgroud)

SQL

SELECT 
    id, IF(report.type = 'P', abs(amount), -1*abs(amount)) as amount
FROM  report
Run Code Online (Sandbox Code Playgroud)

如果所有不是+ ve,你可以跳过abs()


小智 11

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

UNION

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

ORDER BY id;
Run Code Online (Sandbox Code Playgroud)


小智 6

你也可以尝试这个

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
Run Code Online (Sandbox Code Playgroud)