2009-10-15 172 views
1

我有以下結構MySQL查詢幫助

 
id(int) | col1(int) | col2(int) | col3(int) 
------------------------------------------ 
1  | NULL  | 10  | 20 
2  | 5   | NULL  | 30 
3  | 8   | NULL  | NULL 

給定一個「id」值,我需要找到所有列在該記錄最小的非空值的表。
例如,對於id = 1,值爲10.對於id = 2,值爲5,依此類推。

如何在MySQL中執行此操作?

任何幫助將不勝感激!

回答

1

LEAST()會最好,如果它是NULL安全的,但因爲它不是,這是我能想到的最乾淨的解決方案:

SELECT MIN(cols) 
    FROM (SELECT col1 
      FROM table 
     WHERE id = 1 
     UNION 
     SELECT col2 
      FROM table 
     WHERE id = 1 
     UNION col3 
      FROM table 
     WHERE id = 1) AS dt 

如果你ne編它在同一行,這是我能想到的最好的:

SELECT LEAST(COALESCE(col1, col2, col3) 
      , COALESCE(col2, col3, col1) 
      , COALESCE(col3, col1, col2)) 
    FROM table 
WHERE id = 1 
+0

COALESCE選項將變得更可怕的列數:P 您的第一個查詢保存了我的一天。謝謝 :) – nano 2009-10-15 20:59:33

0

已經有一段時間,因爲我用他們,但我認爲你可以使用MySQL的MIN和LEAST功能,像這樣:

SELECT MIN(LEAST(col1,col2,col3)) FROM table WHERE id=1; 
+0

我試過這個,但是這個回報「NULL」作爲最小值而不是非NULL值。 – nano 2009-10-15 20:31:39

+0

是的,我剛剛發現,在調查了一下之後,應該可能在發帖之前做到了這一點! :-) – richsage 2009-10-15 20:32:24

1

這給一個鏡頭:

SELECT id, LEAST(
    ifnull(ifnull(col1, col2), col3), 
    ifnull(ifnull(col2, col1), col3), 
    ifnull(ifnull(col3, col1), col2)) FROM table; 
1
SELECT LEAST(
     COALESCE(col1, col2, col3), 
     COALESCE(col2, col1, col3), 
     COALESCE(col3, col1, col2) 
     ) 
FROM mytable 

另外,使用會話變量:

SELECT LEAST(
     @r := COALESCE(col1, col2, col3), 
     @r := COALESCE(@r, col2), 
     @r := COALESCE(@r, col3) 
     ) 
FROM mytable