2014-11-05 79 views
2


我有表user_groups,我需要选择现场time0的最大int值,如果任何user_group实体time领域有着0
事情是这样的:SELECT MAX字段值或零值

SELECT time FROM user_groups 
WHERE 
IF (time == 0) THEN time = 0 
ELSE MAX(time) 

我需要多平台解决方案。

更新:

我使用mysql
在这种情况下:

id | time | 
1 | 5 | 
2 | 6 | 

我期待6
在这种情况下:

id | time | 
3 | 5 | 
4 | 6 | 
5 | 0 | 

我期待0

+3

哪个数据库SQL服务器,Oracle,MySql等。给出一些示例数据和预期输出。 – TechDo 2014-11-05 07:37:26

+0

因此,对于记录时间= 10,时间= 20和时间= 30,您希望显示30(最大时间),但记录时间= 10,时间= 20和时间= 0,因此您希望显示0时间= 0存在?是? – 2014-11-05 07:42:12

+0

@ThorstenKettner是的,我已经更新了我的问题 – cnaize 2014-11-05 07:44:31

回答

2

将该溶液usues ABS函数也以覆盖负时间的情况下:

SELECT case when min(abs(time)) = 0 then 0 else max(time) end FROM user_groups; 
+1

是的,这是所有支持ABS的dbms的可能解决方案。 (我认为大多数DBMS都这么做,MySQL的确如此。)如果我没有记错的话,ABS是SQL2003的标准SQL函数。 – 2014-11-05 09:41:24

3

如何使用情况

SELECT case when min(time) = 0 then 0 else max(time) end FROM user_groups; 

,或者如果时间可以< 0,但只有时间0以上,应考虑那么添加where子句可以帮助

SELECT case when min(time) = 0 then 0 else max(time) end FROM user_groups where time >= 0; 
+0

这个假设'时间'不能是负面的,这可能或可能不是一个安全的假设。 – 2014-11-05 07:45:05

+0

@Damien_The_Unbeliever,是的,你是对的。我编辑了我的答案,以包含where子句 – micebrain 2014-11-05 08:02:45

+0

如果时间可能为负数,那么从评估中排除这些记录并不是一个好的解决方案。如果只有两条记录,其中time = -1和time = -2,则结果应为-1,但您的查询将导致NULL。 – 2014-11-05 09:44:59

3

检查至少一条记录的时间是否为零。根据结果​​显示0或最大(时间)

select 
    case when max(case when time = 0 then 1 else 0 end) = 1 then 0 else max(time) end 
from user_groups; 

编辑:您已经添加了MySQL标记到您的请求。的MySQL知道一个布尔数据类型,其中TRUE = 1和FALSE = 0。因此,可以写为以上:

select 
    case when max(time = 0) then 0 else max(time) end 
from user_groups; 
+0

我认为你的第二个例子中有错误。它应该是最大(时间)= 0,而不是最大(时间= 0) – rtruszk 2014-11-05 09:34:15

+1

@rtruszk:号'最大(时间= 0)'意味着:检查每个记录的时间= 0。每个匹配是TRUE,这是1 。每个不匹配都是FALSE,它是0.最大值是1 = TRUE,如果至少有一个匹配,或者0 = FALSE,如果没有。 – 2014-11-05 09:38:18

+0

这是一个聪明的解决方案。这很棘手,我第一次错误地解释它。 – rtruszk 2014-11-05 09:48:26