MySQL查询帮助

时间:2009-10-15 20:22:19

标签: 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中执行此操作?

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

试一试:

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

答案 1 :(得分: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

如果你需要一行,这是我能想到的最好的:

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

答案 2 :(得分: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

答案 3 :(得分:0)

自从我使用它们以来已经有一段时间了,但我认为你可以使用MySQL的MIN和LEAST功能:

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