2010-08-19 92 views
21

這應該是簡單的,並顯示我的SQL無知:如何計算Oracle SQL select中兩個數字的最大值?

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

我知道最大通常用於聚集。我可以在這裏使用什麼?

最後,我想用類似

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

其中NUMBER_OF_ITEMS是一個整數,可以爲0。我想看看總也是在這種情況下。

+0

我不確定你正在使用哪個版本的SQL,但我也想把它拋出去。選擇total/IIF(number_of_items <1,1,number_of_items)。我相信這應該工作。 – XstreamINsanity 2010-08-25 14:42:34

回答

14

你可以使用一個CASE聲明

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

謝謝,這個作品! – 2010-08-19 11:45:53

2

通常情況下這將是:

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) 

有可能是一個更清潔儘管如此。

UPDATE:使用 您NUMBER_OF_ITEMS,並從表XXX共有例子,它會是:

SELECT TOTAL/MAX(NUMBER_OF_ITEMS) 
FROM XXX 

更新2: 請記住,如果你允許的項目數爲0,你會得到一個除法的例外0.這就是爲什麼在另一個答案用戶提出的情況下,其他的是TOTAL,這樣你就沒有得到這個例外。

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

應該在這裏工作....

+0

「END」缺失,否則可以使用,謝謝。 – 2010-08-19 11:46:17

56

它看起來像你使用Oracle,因此您可以在地方使用greatest功能此max

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

+1。偉大的(雙關語意) – 2010-08-19 12:22:00

+1

啊,謝謝你,甚至更短。我正在選擇Oracle動態性能視圖。 – 2010-08-19 19:35:06

+1

此功能不是通用的 - 例如,SQL Server不具備此功能。 +1無論如何 – sharptooth 2011-12-22 11:56:19

22

作爲Oracle 10.2他們推出了最偉大的功能,你想要做什麼。還有一個LEAST功能。

實例:

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 
+5

2010年已經有一個答案說明這一點。 – Reimius 2014-05-28 21:17:21

0

有可能做到這一點在甲骨文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而在一般情況,x + abs(x)始終爲零當x < = 0,所以第一decode選項匹配。

我們需要這樣做是因爲我們的一些(第三方)客戶可能仍在使用Oracle 8.0,並且需要花費很多天的時間來了解最後一位客戶是否或將何時最終升級!