Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Menor valor, mas não NULL no Oracle SQL


Se algum argumento for NULL, você deseja obter o menor dos outros argumentos. Se todos os argumentos forem NULL, você deseja retornar NULL.

Eu poderia usar algo assim para dois argumentos:
LEAST(NVL(colA,colB), NVL(colB,colA))

Porém, começa a ficar feio para> 2 argumentos:
LEAST(COALESCE(colA,colB,colC)
     ,COALESCE(colB,colA,colC)
     ,COALESCE(colC,colA,colB))

Nesse ponto eu começaria a considerar valores mágicos; mas isso pode ser problemático (por exemplo, e se um dos valores legitimamente for o valor mágico?):
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));