2010-08-19 249 views
21

Esto debe ser simple y muestra mi ignorancia SQL:¿Cómo calcular el máximo de dos números en 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 

Sé máximo se utiliza normalmente para los agregados. ¿Qué puedo usar aquí?

Al final, quiero usar algo como

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

donde NUMBER_OF_ITEMS es un número entero y puede ser 0. Quiero ver Total también en este caso.

+0

No estoy seguro de qué versión de SQL estás usando, pero también me gustaría comentarlo. SELECCIONE total/IIF (number_of_items <1, 1, number_of_items) desde dual. Creo que debería funcionar – XstreamINsanity

Respuesta

14

Se puede usar un comunicado CASE

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

Gracias, esto funciona! –

2

Normalmente sería:

SELECT MAX(columnName) 
FROM Table1 

O

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

O (y esto sería probablemente lo que quiere en su caso)

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

Puede haber un limpiador manera de hacerlo sin embargo.

ACTUALIZACIÓN: Usando su ejemplo de NUMBER_OF_ITEMS y el total de la Tabla XXX, sería:

SELECT TOTAL/MAX(NUMBER_OF_ITEMS) 
FROM XXX 

ACTUALIZACIÓN 2: tener en cuenta, si se permite que varios artículos a ser 0, se quiere obtener una excepción de división por 0. Es por eso que en la otra respuesta el usuario puso un caso y el resto fue el TOTAL, de esta manera no obtiene esa excepción.

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

deberían trabajar aquí ....

+0

"END" falta, de lo contrario funciona, gracias. –

56

Parece que está utilizando Oracle para que pueda utilizar la función de greatest para este en su lugar de max

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

+1. genial (juego de palabras) –

+1

Ah, gracias eso es aún más corto. Estoy seleccionando en una vista de rendimiento dinámico de Oracle. –

+1

Esta función no es universal; por ejemplo, SQL Server no tiene dicha función. +1 de todos modos – sharptooth

22

A partir de Oracle 10.2 se introdujo una función mayor que, hace lo que quiere. También hay una función LEAST también.

Ejemplos:

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

Ya hay una respuesta de 2010 que dice esto. – Reimius

0

Es posible hacer esto en Oracle 8.0 y anteriores (es decir, antes CASE se introdujo) con el siguiente truco matemático:

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

... lo que equivale a max(1,number_of_items).

Reemplace los tres 1 s anteriores con otro valor según sea necesario.

Esto funciona porque va number_of_items - 1 cero o negativo cuando NUMBER_OF_ITEMS es inferior a 1. Y, en general, x + abs(x) es siempre cero cuando x = 0 <, por lo que la primera opción decode se empareja.

Necesitamos esto porque algunos de nuestros clientes (de terceros) aún pueden estar usando Oracle 8.0 y sería un esfuerzo de muchos días averiguar si el último cliente finalmente se actualizará o cuándo lo hará.

Cuestiones relacionadas