【问题标题】:MySQL query: find the minimum non-null value across all the columns in that recordMySQL查询:在该记录中的所有列中找到最小的非空值
【发布时间】:2010-12-07 04:25:03
【问题描述】:

我有一个结构如下的表

id(int) | col1(int) | col2(int) | col3(整数) ------------------------------------------ 1 |空 | 10 | 20 2 | 5 |空 | 30 3 | 8 |空 |空值

给定一个“id”值,我需要在该记录中找到所有列中的最小非空值
例如,对于 id=1,该值为 10。对于 id =2,该值为 5,依此类推。

我如何在 MySQL 中做到这一点?

【问题讨论】:

    标签: mysql


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • COALESCE 选项会随着列数的增加而变得可怕:P 您的第一个查询拯救了我的一天。谢谢:)
      【解决方案3】:

      试一试:

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

      【讨论】:

        【解决方案4】:

        我使用它们已经有一段时间了,但我认为您可以像这样使用 MySQL 的 MIN 和 LEAST 函数:

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

        【讨论】:

        • 我试过这个,但这会返回 'NULL' 作为最小值而不是非 NULL 值。
        • 是的,我只是在调查了更多之后才发现,可能应该在发布之前就这样做了,抱歉! :-)
        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 2022-07-16
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        相关资源
        最近更新 更多