Oracle SQL中的最小值但不是NULL

Jes*_*owa 9 sql oracle

我想在我的程序中使用LEAST函数来找到最小的值.问题是某些值可能是NULL,所以如果我这样做

select least(NULL,0,1) from dual
Run Code Online (Sandbox Code Playgroud)

我得到的答案是NULL,这可能是正确的,不是我期望返回的东西.我想获得最不真实的非零值.任何帮助非常感谢.

Jef*_*emp 12

如果任何参数为NULL,则您希望至少使用其他参数.如果所有参数都为NULL,则要返回NULL.

我可能会使用这样的两个参数:

LEAST(NVL(colA,colB), NVL(colB,colA))
Run Code Online (Sandbox Code Playgroud)

它开始变得难看为> 2个参数但是:

LEAST(COALESCE(colA,colB,colC)
     ,COALESCE(colB,colA,colC)
     ,COALESCE(colC,colA,colB))
Run Code Online (Sandbox Code Playgroud)

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

SELECT CASE WHEN r = maxv THEN NULL ELSE r END AS result
FROM   (SELECT LEAST(NVL(:colA,maxv)
                    ,NVL(:colB,maxv)
                    ,NVL(:colC,maxv)) AS r, maxv
        FROM   (SELECT 9.999999999999999999999999999999999999999e125
                       AS maxv FROM DUAL));
Run Code Online (Sandbox Code Playgroud)

  • 对于两个参数,有一个更简单的公式:“coalesce(least(x, y), x, y)”,这更简单,因为只有 2 个函数调用。对于 3 个或更多参数,我相信您的解决方案是最紧凑的。 (2认同)

ten*_*our 5

我怀疑这实际上是您的查询。也许你正在做更多这样的事情?

select least(some_column) from dual
Run Code Online (Sandbox Code Playgroud)

如果是这样,请将其更改为:

select least(some_column) from dual where some_column is not null
Run Code Online (Sandbox Code Playgroud)

或者,如果你正在做更像这样的事情,你不能只是where用来过滤集合,

select least(expr1,expr2,expr3) from dual
Run Code Online (Sandbox Code Playgroud)

做这个:

select least(coalesce(expr1, 12345), coalesce(expr2, 12345), coalesce(expr3, 12345)) from dual
Run Code Online (Sandbox Code Playgroud)

哪里12345是一个足够大的值,只有在所有其他表达式都是NULL.

  • LEAST 应该总是用至少 2 个参数来调用,否则它是没用的;你最初的例子可能会让新手感到困惑。此外,如果所有参数都是 NULL,则返回“12345”(或您使用的任意大数)而不是 NULL 是一个等待发生的错误,恕我直言。 (4认同)