如何在mysql中检查负值并在此之后确定输出

时间:2015-03-23 13:18:58

标签: mysql sql

我正在使用mysql案例进行一些计算,我的要求是如果输出为负,那么我将在负列的位置显示0。否则为正值。

让我发布查询:

select 
    concat(jo.title,' (', CCP.name, ')'), PL.analyst, PL.consultant, 
    PL.csm, 
    (CASE 
         WHEN PL.productType like 'Staffing' THEN (SELECT ((DATEDIFF(PL.dateEnd, PL.dateClientEffective)) -((WEEK(PL.dateEnd) - WEEK(PL.dateClientEffective)) * 2) - (case when weekday(PL.dateEnd) = 6 then 1 else 0 end) - (case when weekday(PL.dateClientEffective) = 5 then 1 else 0 end)) as DifD) * 8 * (PL.clientBillRate-PL.payRate) ELSE (PL.salary*PL.fee)END) Value

现在如果值为负,则应显示0否则将显示原始值

4 个答案:

答案 0 :(得分:3)

最简单的方法就是使用greatest()

select greatest(<expression>, 0) as col

目前还不清楚要在查询中使用哪个列/表达式。但是,你可以插上它。

此方法优于其他方法的优点是:

  • 唯一需要在查询中出现一次。不必重复代码可以减少出错的可能性。
  • 不需要子查询。这只是MySQL中的一个问题,因为MySQL实现了子查询。

答案 1 :(得分:0)

请检查一下,还没有测试过。

注意:这可能不是最佳解决方案

 select concat(jo.title,' (', CCP.name, ')'), PL.analyst, PL.consultant, PL.csm, 
if(
(CASE WHEN PL.productType like 'Staffing' THEN (SELECT ((DATEDIFF(PL.dateEnd, PL.dateClientEffective)) -((WEEK(PL.dateEnd) - WEEK(PL.dateClientEffective)) * 2) - 
(case when weekday(PL.dateEnd) = 6 then 1 else 0 end) - 
(case when weekday(PL.dateClientEffective) = 5 then 1 else 0 end)) as DifD) * 8 * (PL.clientBillRate-PL.payRate) ELSE (PL.salary*PL.fee)END)
 < 0,0,
(CASE WHEN PL.productType like 'Staffing' THEN (SELECT ((DATEDIFF(PL.dateEnd, PL.dateClientEffective)) -((WEEK(PL.dateEnd) - WEEK(PL.dateClientEffective)) * 2) - 
(case when weekday(PL.dateEnd) = 6 then 1 else 0 end) - 
(case when weekday(PL.dateClientEffective) = 5 then 1 else 0 end)) as DifD) * 8 * (PL.clientBillRate-PL.payRate) ELSE (PL.salary*PL.fee)END)
 ) Value

答案 2 :(得分:0)

就这样做:

 select temp.* , --all your columns  
 if(temp.value<0,0,temp.value) as Value
 from
 ( your query mentioned above) temp;

答案 3 :(得分:0)

在mysql中简单地使用SIGN() 它返回 1 为正值,-1 为负值

示例

SELECT SIGN(500); -- (Output is 1)
SELECT SIGN(2500); -- (Output is 1)

SELECT SIGN(-999); -- (Output is -1)
SELECT SIGN(-5); -- (Output is -1)