2014-11-05 82 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