Подтвердить что ты не робот

Как рассчитать максимум двух чисел в Oracle SQL select?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Похоже, вы используете Oracle, поэтому вместо max

вы можете использовать функцию greatest
select total/greatest(1,number_of_items) 
from xxx;

Ответ 3

Начиная с 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

Ответ 4

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

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

Ответ 5

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

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;

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

Ответ 6

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

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 и total из таблицы XXX, это будет:

SELECT TOTAL/MAX(NUMBER_OF_ITEMS)
FROM   XXX

ОБНОВЛЕНИЕ 2: Имейте в виду, если вы разрешите количество элементов равным 0, вы получите исключение из деления на 0. Вот почему в другом ответе пользователь поставил случай, а else - TOTAL, таким образом вы не получите этого исключение.

Ответ 7

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

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