代码之家  ›  专栏  ›  技术社区  ›  Peter G.

如何计算Oracle SQL Select中最多两个数字?

  •  24
  • Peter G.  · 技术社区  · 14 年前

    这应该很简单,并且显示了我对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;
    

    其中,“项目数”是一个整数,可以是0。我想看看这个病例的总数。

    7 回复  |  直到 7 年前
        1
  •  15
  •   Lieven Keersmaekers    14 年前

    你可以使用 CASE 陈述

    SELECT Total = CASE WHEN number_of_items > 0 
                   THEN total/number_of_items
                   ELSE total END
    FROM   xxx
    
        2
  •  64
  •   Martin Smith    14 年前

    看起来您使用的是Oracle,因此可以使用 greatest 代替 max

    select total/greatest(1,number_of_items) 
    from xxx;
    
        3
  •  27
  •   3per    7 年前

    从Oracle10.2开始,他们引入了一个最大的功能,可以满足您的需求。还有一个最小的功能。

    实例:

    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
  •  3
  •   Hari Menon    14 年前
    SELECT total/(CASE WHEN number_of_items>1 THEN number_of_items ELSE 1) FROM xxx
    

    应该在这里工作……

        5
  •  2
  •   XstreamINsanity    14 年前

    通常是:

    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)
    

    不过,可能有一种更清洁的方法。

    更新: 使用表XXX中的“项目数”和“总数”示例,它将是:

    SELECT TOTAL/MAX(NUMBER_OF_ITEMS)
    FROM   XXX
    

    更新2: 请记住,如果允许项目数为0,则会得到除法为0的异常。这就是为什么在另一个答案中,用户提出了一个案例,而另一个是总数,这样您就不会得到那个异常。

        6
  •  2
  •   Community CDub    8 年前

    您必须为此创建一个新函数:

    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;
    

    签出此线程以获取更多详细信息: Is there a Max function in SQL Server that takes two values like Math.Max in .NET?

        7
  •  0
  •   wardies    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,并且需要花费很多天的时间来查明最后一个客户是否最终升级或何时升级!