如何计算Oracle SQL中两个数字的最大值?

时间:2010-08-19 11:09:29

标签: sql oracle max

这应该很简单,并显示我的SQL无知:

SQL> select max(1,2) from dual;
select max(1,2) from dual
       *
ERROR at line 1:
ORA-00909: invalid number of arguments

我知道max通常用于聚合。我可以在这里使用什么?

最后,我想使用像

这样的东西
select total/max(1,number_of_items) from xxx;

其中number_of_items是一个整数,可以是0.我想在这种情况下看到总数。

7 个答案:

答案 0 :(得分:67)

看起来您正在使用Oracle,因此您可以使用greatest函数代替max

select total/greatest(1,number_of_items) 
from xxx;

答案 1 :(得分:27)

从Oracle 10.2开始,他们推出了一个GREATEST功能,可以满足您的需求。还有一个最低功能。

示例:

select greatest(1,2) from dual;

GREATEST(1,2)
-------------
            2

select greatest(8,6,4,2) from dual;

GREATEST(8,6,4,2)
-----------------
               8

select greatest(-1,-2) from dual;

GREATEST(-1,-2)
---------------
             -1

select greatest('A','B','CCC','D') from dual;

GREATEST('A','B','CCC','D')
---------------
              D

答案 2 :(得分:14)

您可以使用CASE声明

SELECT Total = CASE WHEN number_of_items > 0 
               THEN total/number_of_items
               ELSE total END
FROM   xxx

答案 3 :(得分:3)

SELECT total/(CASE WHEN number_of_items>1 THEN number_of_items ELSE 1 END) FROM xxx

应该在这里工作.......

答案 4 :(得分:2)

您必须为此创建一个新功能:

CREATE FUNCTION InlineMax
(
    @p1 sql_variant,
    @p2 sql_variant
)  RETURNS sql_variant
AS
BEGIN
    RETURN 
    CASE 
        WHEN @p1 IS NULL AND @p2 IS NOT NULL THEN @p2 
        WHEN @p2 IS NULL AND @p1 IS NOT NULL THEN @p1
        WHEN @p1 > @p2 THEN @p1
        ELSE @p2 END
END;

查看此主题以获取更多详细信息:Is there a Max function in SQL Server that takes two values like Math.Max in .NET?

答案 5 :(得分:1)

通常情况是:

SELECT MAX(columnName)
FROM   Table1

或者

SELECT MAX(columnName)
FROM   (SELECT * FROM TableX) AS T1

或者(这可能是你想要的)

SELECT MAX(value)
FROM   (SELECT 1 AS VALUE FROM DUAL UNION SELECT 2 AS VALUE FROM DUAL)

虽然可能有更简洁的方法。

更新: 使用您的number_of_items示例和表XXX中的总数,它将是:

SELECT TOTAL/MAX(NUMBER_OF_ITEMS)
FROM   XXX

更新2: 请记住,如果你允许的项目数为0,你将获得除以0的例外。这就是为什么在另一个答案中用户提出一个案例而其他是TOTAL,这样你就不会得到异常。

答案 6 :(得分:1)

可以在Oracle 8.0及更早版本(即引入CASE之前)执行此操作,并使用以下数学技巧:

SELECT DECODE(NUMBER_OF_ITEMS-1+ABS(NUMBER_OF_ITEMS-1), 0, 1, NUMBER_OF_ITEMS) AS TOTAL
FROM   xxx

...相当于max(1,number_of_items)

根据需要将上面的三个1替换为另一个值。

这是有效的,因为当number_of_items小于1时,number_of_items - 1变为零或为负。通常,当{< = 0时x + abs(x)始终为零,因此第一个decode选项匹配。

我们需要这个,因为我们的某些(第三方)客户可能仍在使用Oracle 8.0,并且需要花费很多时间来确定最后一位客户是否或何时最终升级!