Oracle SQL中的最小值但不为NULL

Oracle SQL中的最小值但不为NULL,sql,oracle,Sql,Oracle,我想在我的过程中使用函数LEAST来寻找最小值。问题是有些值可能是空的,所以如果我这样做的话 select least(NULL,0,1) from dual 我得到的答案是NULL,这可能是正确的,因为我不希望返回。我想得到最小的非零值。非常感谢您的帮助。我怀疑这是您的问题。也许你在做更像这样的事 select least(some_column) from dual 如果是,请将其更改为: select least(some_column) from dual where some_co

我想在我的过程中使用函数LEAST来寻找最小值。问题是有些值可能是空的,所以如果我这样做的话

select least(NULL,0,1) from dual

我得到的答案是NULL,这可能是正确的,因为我不希望返回。我想得到最小的非零值。非常感谢您的帮助。

我怀疑这是您的问题。也许你在做更像这样的事

select least(some_column) from dual
如果是,请将其更改为:

select least(some_column) from dual where some_column is not null

或者,如果您正在执行类似的操作,您不能仅使用
where
来过滤集合

select least(expr1,expr2,expr3) from dual
这样做:

select least(coalesce(expr1, 12345), coalesce(expr2, 12345), coalesce(expr3, 12345)) from dual

其中,
12345
是一个足够大的值,仅当所有其他表达式均为
NULL

时才会选择该值。如果任何参数为NULL,则希望取其他参数中最小的一个。如果所有参数都为NULL,则希望返回NULL

对于两个参数,我可能会使用类似的内容:

LEAST(NVL(colA,colB), NVL(colB,colA))
但是,对于>2个参数,它开始变得丑陋:

LEAST(COALESCE(colA,colB,colC)
     ,COALESCE(colB,colA,colC)
     ,COALESCE(colC,colA,colB))
在这一点上,我开始考虑神奇的价值观;但这可能是错误的(例如,如果其中一个值合法地是魔法值怎么办?)


在三个“coalesce”调用中按三个顺序使用这三个表达式,并将它们放在“least”调用中,将导致三个表达式中的最少一个,忽略null,除非所有三个表达式都为null

select least(coalesce(expr1, expr2, expr3), coalesce(expr2, expr3, expr1), coalesce(expr3, expr1, expr2)) from dual

一种方法是定义自己的
LEAST/magest
func版本:

-- here version for two params
WITH  FUNCTION least_improved(p1 IN NUMBER, p2 IN NUMBER) RETURN NUMBER IS
BEGIN
    IF p1 IS NULL THEN
       RETURN p2;
    ELSIF p2 IS NULL THEN
       RETURN p1;
    ELSE
       RETURN LEAST(p1, p2);
    END IF; 
END;
SELECT least_improved(col1, col2)
FROM table_name;
/
将返回列1到N集合中的最小值

SELECT GREATEST( COALESCE(Col1, -INFINITY ), COALESCE(Col2, -INFINITY ) , ... , COALESCE(ColN, -INFINITY ) ) FROM MY_TABLE
将返回从第1列到第N列的最大值

INFINITY:至少在db2中,“INFINITY”值可以用作所有值中的最大值,“-INFINITY”值可以用作所有值中的最小值。 (有人告诉我,甲骨文有不同类型的无穷大)

COALESCE:此函数将返回参数列表中第一个非null参数,例如:COALESCE(null,null,null,null,null,1,2,3,4,5)将返回1(第一个非null参数)

因此,在该查询中使用coalesce将null值替换为无穷大值,确保该值不会被选为最低值之一,除非所有列都有null值,否则在这种情况下,查询将返回无穷大而不是null

要从查询中删除无限结果,只需添加where子句检查所有值是否为null,也可以使用coalesce函数执行此操作:

WHERE COALESCE( Col1, Col2, ..., ColN ) IS NOT NULL

如果您有许多列需要从中获取最小值和最大值,您可以将它们取消分割为单个列,这样就很简单了;从单个列中排除空值&使用MIN()或MAX()获取所需内容

我需要用大约50个日期列(不是很好的数据库设计)来完成这项工作,而UNPIVOT似乎是最明智/最实用的方法

SELECT least(1, 2, 3, nvl(NULL,4)) FROM dual
回报:1

SELECT GREATEST(1, 2, 3, nvl(NULL,0)) FROM dual

Return:3

谢谢@tenfour,我不得不比较多个结果,其中一些结果可能是空的。coalesce解决了我的问题。至少应该始终使用至少2个参数调用LEAST,否则它是无用的;您最初的示例可能会让新手感到困惑。此外,如果所有参数都为NULL,那么返回
12345
(或者任意使用的大数字)而不是NULL是一个等待发生的错误,IMHO。我同意;事实上,我觉得如果你想对集合进行这种控制,你真的应该使用子查询分解来旋转它,这样逻辑就变得更合理了。对不起,但我觉得接受的答案更好。对于两个参数,有一个更简单的公式:
coalesce(最少(x,y),x,y)
这更简单,因为只有两个函数调用。对于3个或更多的论点,我相信你的解决方案是最简洁的。
SELECT least(1, 2, 3, nvl(NULL,4)) FROM dual
SELECT GREATEST(1, 2, 3, nvl(NULL,0)) FROM dual