2009-10-15 132 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