2

我有一张如下表:

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

现在我想获取 value1、value2、value3 和 value4 的最小值,然后返回具有最高最小值的 user_id。

我考虑过使用least然后按降序分组,但是如何有效地检查空值?该表的输出将是:

user_id value
3       3
1       2
2       2
4

3 回答 3

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)

于 2012-07-06T08:35:27.533 回答
1

使用COALESCE() 它返回第一个非 NULL 参数

 SELECT COALESCE(LEAST(`value1`,`value2`,`value3`),0) AS min ...
于 2012-07-06T08:35:38.537 回答
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()因为它更便携。

于 2012-07-06T08:37:13.960 回答