我有一张表如下:
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
然后按降序分组,但如何有效地检查null?
该表的输出为:
user_id value
3 3
1 2
2 2
答案 0 :(得分: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)
答案 1 :(得分:1)
使用COALESCE()
它返回第一个非NULL参数
SELECT COALESCE(LEAST(`value1`,`value2`,`value3`),0) AS min ...
答案 2 :(得分: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()
,因为它更便携。