如何使用LEAST()在MySQL中获取至少3个值,其中一些值可能为null?

如何使用LEAST()在MySQL中获取至少3个值,其中一些值可能为null?,mysql,sql,Mysql,Sql,我在寻找比较离散值集的方法时发现了这个问题() 我希望能够获得少数选中的值的最小值,其中一些值可能为null,因为它们是可选的,但是 如果任何参数为NULL,则结果为NULL 对可空值使用COALESCE()函数: select LEAST(COALESCE(@foo, <max int>), COALESCE(@bar, <max int>)); 选择最小值(合并(@foo,),合并(@bar,); 如果您得到max int值,那么这两个值都是空的(除非有足够的机会

我在寻找比较离散值集的方法时发现了这个问题()

我希望能够获得少数选中的值的最小值,其中一些值可能为
null
,因为它们是可选的,但是

如果任何参数为NULL,则结果为NULL

对可空值使用
COALESCE()
函数:

select LEAST(COALESCE(@foo, <max int>), COALESCE(@bar, <max int>));
选择最小值(合并(@foo,),合并(@bar,);
如果您得到max int值,那么这两个值都是空的(除非有足够的机会将max int值作为实数参数,否则需要更多的逻辑)

这样如何:

LEAST(COALESCE(col1, col2, col3),
      COALESCE(col2, col3, col1),
      COALESCE(col3, col1, col2))

显然,这不能很好地扩展到3个以上的值。

有效,易于扩展,并且不依赖于数据中找不到的任何值,但可能效率极低

CREATE TABLE X
(
Id int primary key,
col1 int null,
col2 int null,
col3 int null
)
质疑


你必须硬编码一个大数字,比如99999

最小值(如果为空(COL_1999999),
如果为空(COL_299999), 如果为空(COL_399999), IFNULL(COL_1999999))


i、 e.只需添加IFNULL,然后是一个足够大的整数的值或列名。

那么,为什么您的问题是如何使用
Least
来具体执行?在标题中添加Least,这样我就不会混淆任何人这是MAX/MIN问题。任何其他工作方法都是可取的。这是一种有趣的方法,尽管我不知道它有多实用。为什么要这样引用其他列?哦,我不能说它会起作用,我只是设想了一种情况,在这种情况下,对三个完全相同的数字运行LEAST(),因为只有一个值不是null。对我来说,这似乎是一种浪费,但无论如何,这可能没有什么区别。对我来说,这似乎也是一种浪费。最大值似乎更容易比较。@MarkByers-true。。。不过,我不能在字符数据上使用LEAST()。@Jeremy:按字典顺序排列单词-在lexikon中找到第一个。@ypercube这对我来说似乎是一个按顺序/限制排列的教科书案例。。。使用
LEAST()
。。。嗯,我想你能做到。老实说,我从来没有使用过它,也没有感觉到它的不足。我不知道字符“max”,但我想这取决于数据。如果离散集的已知最大值远低于最大值,则此解决方案(使用最大值)的效果更好。
SELECT id,
       Min(CASE c
             WHEN 1 THEN col1
             WHEN 2 THEN col2
             WHEN 3 THEN col3
           END)
FROM   x,
       (SELECT 1 AS c
        UNION ALL
        SELECT 2
        UNION ALL
        SELECT 3) t
GROUP  BY id