【问题标题】:How to calculate the maximum of two numbers in Oracle SQL select?如何计算Oracle SQL select中两个数字的最大值?
【发布时间】:2023-03-24 10:50:02
【问题描述】:

这应该很简单,表明我对 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。在这种情况下,我也想查看总数。

【问题讨论】:

  • 我不确定您使用的是哪个版本的 SQL,但我也想把它扔掉。 SELECT total/IIF(number_of_items

标签: sql oracle max


【解决方案1】:

通常是:

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)

不过可能有更简洁的方法。

更新: 使用您的 number_of_items 和表 XXX 中的总数示例,它将是:

SELECT TOTAL/MAX(NUMBER_OF_ITEMS)
FROM   XXX

更新 2: 请记住,如果您允许项目数为 0,您将得到除以 0 的异常。这就是为什么在另一个答案中用户输入一个案例而其他答案是 TOTAL,这样您就不会得到那个例外。

【讨论】:

    【解决方案2】:

    您可以使用CASE 声明

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

    【讨论】:

      【解决方案3】:
      SELECT total/(CASE WHEN number_of_items>1 THEN number_of_items ELSE 1 END) FROM xxx
      

      应该在这里工作......

      【讨论】:

        【解决方案4】:

        看起来您正在使用 Oracle,因此您可以使用 greatest 函数代替 max

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

        【讨论】:

        • 啊,谢谢,那就更短了。我正在选择 Oracle 动态性能视图。
        • 这个功能不是通用的——比如SQL Server就没有这个功能。无论如何都要 +1
        • 这是greatest 的答案。
        【解决方案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;
        

        查看此线程了解更多详情:Is there a Max function in SQL Server that takes two values like Math.Max in .NET?

        【讨论】:

          【解决方案6】:

          从 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
          

          【讨论】:

            【解决方案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)

            根据需要将上面的三个1s 替换为另一个值。

            之所以有效,是因为当 number_of_items 小于 1 时,number_of_items - 1 为零或负数。通常,当 x x + abs(x) 始终为零,因此第一个 decode 选项匹配。

            我们需要这个,因为我们的一些(第 3 方)客户可能仍在使用 Oracle 8.0,而且要查明最后一个客户是否或何时最终升级需要很多天的时间!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-11-12
              • 2023-04-02
              • 1970-01-01
              • 2012-03-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多