Как рассчитать максимум двух чисел в Oracle SQL Select? - PullRequest
25 голосов
/ 19 августа 2010

Это должно быть просто и показывает мое незнание 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. Я хочу видеть итоговое значение и в этом случае.

Ответы [ 7 ]

69 голосов
/ 19 августа 2010

Похоже, вы используете Oracle, поэтому вы можете использовать для этого функцию greatest вместо max

select total/greatest(1,number_of_items) 
from xxx;
27 голосов
/ 12 марта 2014

Начиная с Oracle 10.2, они представили функцию GREATEST, которая делает то, что вы хотите. Также есть функция 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
14 голосов
/ 19 августа 2010

Вы можете использовать оператор CASE

SELECT Total = CASE WHEN number_of_items > 0 
               THEN total/number_of_items
               ELSE total END
FROM   xxx
3 голосов
/ 19 августа 2010
SELECT total/(CASE WHEN number_of_items>1 THEN number_of_items ELSE 1 END) FROM xxx

должно работать здесь .......

2 голосов
/ 24 февраля 2014

Вам нужно будет создать новую функцию для этого:

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;

Оформить этот поток для получения более подробной информации: Есть ли в SQL Server функция Max, которая принимает два значения, такие как Math.Maxв .NET?

1 голос
/ 14 декабря 2017

Это можно сделать в 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. И, как правило, x + abs(x) всегда равно нулю, когда x <= 0, поэтому первая опция <code>decode совпадает.

Нам это нужно, потому что некоторые из наших (сторонних) клиентов все еще могут использовать Oracle 8.0, и было бы много дней, чтобы выяснить, будет ли последний клиент окончательно обновляться!

1 голос
/ 19 августа 2010

Обычно это будет:

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. Поэтому в другом ответе пользователь поставил регистр, а остальное - ИТОГО, таким образом, вы не получите исключение.

...