如何计算Oracle SQL select中两个数字的最大值?
这应该很简单,并且显示了我对SQL的无知:如何计算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> 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