2012-07-06 60 views
2

我有一個表如下:檢查空的一種功能

user_id value1 value2 value3 value4 
1  2  3  4  null 
2  null 5  2  null 
3  null null 100 3 
... 

現在我想要得到的最低值1,值2,值3和值4,然後用最高的最低迴報USER_ID。

我想過使用least然後按降序分組,但是如何有效檢查null? 該表的輸出將是:

user_id value 
3  3 
1  2 
2  2 
+1

顯示您的查詢 – diEcho 2012-07-06 08:34:21

+0

您可以使用'isnull(value1,0)' – alfasin 2012-07-06 08:34:58

+0

@alfasin:不,你不能。 MySQL ['ISNULL'](http://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#function_isnull「ISNULL(MySQL)」)完全不同於['COALESCE'](http ://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#function_coalesce「COALESCE(MySQL)」),它只接受1個參數並表示它是否爲NULL。您必須考慮SQL Server ['ISNULL'](http://msdn.microsoft.com/zh-cn/library/ms184325.aspx「ISNULL(Transact-SQL)」)。 SQL Server'ISNULL'≈MySQL ['IFNULL'](http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html#function_ifnull「IFNULL(MySQL)」) – 2012-07-06 09:16:33

回答

3

~0>>1會給你在mysql的最大BigInt有值(應該是足夠了)

coalesce(
     nullif(
      least(coalesce(value1, ~0>>1), coalesce(value2, ~0>>1), 
       coalesce(value3, ~0>>1), coalesce(value4, ~0>>1)), 
     ~0>>1), 
0) 

或你所要做的組合(我把所有這些,不知道這是必要的)

coalesce 
    (least(
     coalesce(value1, value2, value3, value4), 
     coalesce(value1, value2, value4, value3), 
     coalesce(value1, value3, value2, value4), 
     coalesce(value1, value3, value4, value2), 
     coalesce(value1, value4, value2, value3), 
     coalesce(value1, value4, value3, value2), 
     coalesce(value2, value1, value3, value4), 
     coalesce(value2, value1, value4, value3), 
     coalesce(value2, value3, value1, value4), 
     coalesce(value2, value3, value4, value1), 
     coalesce(value2, value4, value1, value3), 
     coalesce(value2, value4, value3, value1), 
     coalesce(value3, value1, value2, value4), 
     coalesce(value3, value1, value4, value2), 
     coalesce(value3, value2, value1, value4), 
     coalesce(value3, value2, value4, value1), 
     coalesce(value3, value4, value1, value2), 
     coalesce(value3, value4, value2, value1), 
     coalesce(value4, value1, value2, value3), 
     coalesce(value4, value1, value3, value2), 
     coalesce(value4, value2, value1, value3), 
     coalesce(value4, value2, value3, value1), 
     coalesce(value4, value3, value1, value2), 
     coalesce(value4, value3, value2, value1) 
) 

,0)

+0

@TerryUhlang編輯:事情最後一個是最正確的。 – 2012-07-06 09:19:46

+0

要將'9999'「變換」回NULL,可以使用'nullif(least(coalesce(value1,9999),...),9999)'。 – 2012-07-06 09:20:14

+0

@AndriyM對。我應該這樣做。但是這個解決方案無論如何都是相當糟糕 – 2012-07-06 09:21:42

1

使用COALESCE()它返回第一個非空參數

SELECT COALESCE(LEAST(`value1`,`value2`,`value3`),0) AS min ... 
+1

你不需要有合併價值嗎?像:coalesce(至少(...),otherValue)?或者如果沒有給定價值,它會做什麼?是否有可能只輸出分鐘,如果分鐘,可以說,大於5? – 2012-07-06 08:43:41

1

如果您有任何的參數least()NULL,那麼整個結果將是NULL。你的情況,你可以很容易地轉換NULL結果到零(0),這似乎是至少一個:

SELECT coalesce(least(value1, value2, value3, value4), 0) 
    FROM table; 

如果你想對你的領域有不同的默認,然後你需要用他們到單獨的coalesce()電話:

SELECT coalesce(least(value1, coalesce(value2, 2), value3, value4), 0) 
    FROM table; 

我使用coalesce()代替isnull(),因爲它更便於攜帶。

+0

+1有關不同默認值的有趣想法。 – 2012-07-06 09:29:39