MySQL 查询选择最小的非空、非零整数

Posted

技术标签:

【中文标题】MySQL 查询选择最小的非空、非零整数【英文标题】:MySQL query selecting the least non-null, non-zero integer 【发布时间】:2012-05-02 19:48:03 【问题描述】:

我有一个包含 5 列的表:uniqueidint1int2int3FruitStand。我正在寻找的是一个关于如何进行单个选择的示例,该选择输出具有最少非空、非零整数的列的数据。

示例表:

uniqueid|int1|int2|int3|FruitStand
1       |   2|   3|   4|Apples
2       |  21|   4|   0|Oranges
3       |NULL|   2|   5|Pears

所以我会从这个查询中得到结果

1       |   2|Apples
2       |   4|Oranges
3       |   2|Pears

【问题讨论】:

如果它是“任一列不为空且值不为 0”,那么为什么预期结果会从第二条记录中省略 21?这有点令人困惑。你能详细说明你的假设吗? @PavelVeller 排除列不为空且值不为 0 的情况。这有帮助吗?我把它放在编辑中 有道理。我想我没有看到规则中的least 部分。 还有另一种使用IFNULLLEAST() 的方法。请看:***.com/a/36601711/2427579 【参考方案1】:
SELECT uniqueid,
FruitStand,
LEAST(
    COALESCE(int1, int2, int3),
    COALESCE(int2, int3, int1),
    COALESCE(int3, int1, int2)) AS number
FROM myTable

为了便于阅读,我省略了COALESCE 中每个参数的NULLIF(intX, 0)。您需要添加这些以忽略零值。

在使用 LEAST 函数时,您需要使用 COALESCE 来避免使用 NULL 值,因为从 mysql 5.0.13 开始,如果任何参数为 NULLLEAST 将返回 NULL

有关详细信息,请参阅this question。

【讨论】:

埃文,你确定 nullif 吗?我尝试不使用 nullif 并且它重复最低值而不管 null【参考方案2】:
SELECT LEAST(
    IF(int1,int1,999999),
    IF(int2,int2,999999),
    IF(int3,int3,999999)
);

这里,值 999999 应该是这些列的最大可能值。

【讨论】:

IFNULL(int1, 999999) 更短

以上是关于MySQL 查询选择最小的非空、非零整数的主要内容,如果未能解决你的问题,请参考以下文章

最小切片位置 - 阶 N 算法

与其他列中的最小值关联的非空值

R:在分组列中变异非零最小值

java codility 训练基因组范围查询

R - 创建几列非零最小值的新列

查找数组中的绝对最小值