Ответ 1
Вы можете использовать оператор CASE
SELECT Total = CASE WHEN number_of_items > 0
THEN total/number_of_items
ELSE total END
FROM xxx
Это должно быть простым и показать мое незнание 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. Я хочу также увидеть итоговое значение в этом случае.
Вы можете использовать оператор CASE
SELECT Total = CASE WHEN number_of_items > 0
THEN total/number_of_items
ELSE total END
FROM xxx
Похоже, вы используете Oracle, поэтому вместо max
greatest
select total/greatest(1,number_of_items)
from xxx;
Начиная с 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
SELECT total/(CASE WHEN number_of_items>1 THEN number_of_items ELSE 1 END) FROM xxx
должен работать здесь.......
Для этого вам нужно создать новую функцию:
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?
Обычно это будет:
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, таким образом вы не получите этого исключение.
Это можно сделать в 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, и было бы много дней усилий, чтобы выяснить, будет ли и когда последний клиент наконец обновится!