这应该很简单,并显示我的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.我想在这种情况下看到总数。
答案 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,并且需要花费很多时间来确定最后一位客户是否或何时最终升级!