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

如何计算Oracle SQL select中两个数字的最大值?,sql,oracle,max,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; 其中,项目的数量为整数,可以为0。在这种情况

这应该很简单,并且显示了我对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;
其中,项目的数量为整数,可以为0。在这种情况下,我也希望看到总数。

通常是:

SELECT MAX(columnName)
FROM   Table1

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

不过,可能有一种更干净的方法

更新: 以表XXX中的项目数量和总数为例,如下所示:

SELECT TOTAL/MAX(NUMBER_OF_ITEMS)
FROM   XXX
更新2: 请记住,如果允许项目数为0,则会出现除0的异常。这就是为什么在另一个答案中,用户放了一个case,而else是总数,这样你就不会得到例外。

你可以使用一个语句

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

应该可以在这里使用……

看起来您正在使用Oracle,因此您可以使用
最大值
功能来代替
最大值

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

您必须为此创建一个新函数:

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;

查看此线程以了解更多详细信息:

从Oracle 10.2开始,他们引入了一个最强大的功能,可以满足您的需要。还有一个最小函数

示例:

从dual中选择最大值(1,2)

从dual中选择最大值(8,6,4,2)

从dual中选择最大(-1,-2)

从dual中选择最大值('A','B','CCC','D')


在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,项目数)

根据需要,用另一个值替换上述三个
1
s


这是因为当项目的数量小于1时,
项目的数量-1将变为零或负。一般来说,
x+abs(x)
在x时总是为零,谢谢,它甚至更短。我在Oracle动态性能视图上选择。此功能不是通用的-例如,SQL Server没有此功能+1无论如何,这是最好的答案。我不确定您使用的是哪个版本的SQL,但我也想把它扔出去。从dual中选择total/IIF(项目数量<1,1,项目数量)。我认为这应该行得通。
select total/greatest(1,number_of_items) 
from xxx;
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;
GREATEST(1,2)
-------------
            2
GREATEST(8,6,4,2)
-----------------
               8
GREATEST(-1,-2)
---------------
             -1
GREATEST('A','B','CCC','D')
---------------
              D
SELECT DECODE(NUMBER_OF_ITEMS-1+ABS(NUMBER_OF_ITEMS-1), 0, 1, NUMBER_OF_ITEMS) AS TOTAL
FROM   xxx