【问题标题】:How to find Negative maximum and positive minimum in Oracle?如何在Oracle中找到负最大值和正最小值?
【发布时间】:2015-10-28 02:55:01
【问题描述】:

我有一个number 类型的列。它有正值和负值。我需要得到 4 个值:正最大值、正最小值、负最大值、负最小值:

a)要获得正最大值:我可以使用Check out the Fiddle

select max(cola) from test;

b)要获得负最小值:我可以使用Check out the Fiddle

select min(cola) from test;

我有两个问题:

1) 现在我不确定如何获得其他两个值。指导我得到那个

2)与此同时,我在尝试这个时又遇到了另一个疑问。当我有一些varchar2 类型的列并且它有数字作为值时。我正在本专栏中执行上述操作。正最大值与上述相同。但是负最小值很奇怪。 Check Fiddle Here 。为什么这里没有进行适当的隐式转换。有人请解释一下这背后的原因吗?

【问题讨论】:

  • 对于问题 1,使用 CASE 表达式。对于问题2,使用TO_NUMBER先将字符串转换为数字,然后其余相同。

标签: sql oracle oracle11g max min


【解决方案1】:

对于问题 1,您可以轻松地使用案例来确定您在哪些值上执行最小值/最大值。例如:

select max(case when cola >= 0 then cola end) max_positive,
       min(case when cola >= 0 then cola end) min_positive,
       max(case when cola < 0 then cola end) max_negative,
       min(case when cola < 0 then cola end) min_negative
from   test;

对于问题 2,当您对 varchar 的东西执行最小/最大值时,您将进行字符串比较,NOT 数字比较。您必须将值显式转换为数字,因为 Oracle 不知道您期望发生隐式转换。而且你不应该真的依赖隐式转换。例如:

select max(case when to_number(cola) >= 0 then to_number(cola) end) max_positive,
       min(case when to_number(cola) >= 0 then to_number(cola) end) min_positive,
       max(case when to_number(cola) < 0 then to_number(cola) end) max_negative,
       min(case when to_number(cola) < 0 then to_number(cola) end) min_negative
from   test1;

Here's the SQLFiddle for both cases.

注意我已经明确地将负值和正值分开(我将 0 与正数放在一起;您必须决定如何处理值为 0 的行!),以防万一没有负数或没有正数。

【讨论】:

  • 我应该补充一点,如果您的 varchar2 列中同时存储了数字和文本,并且您对其执行了 to_number() 操作,您可能会遇到问题。但是您永远不会将数据存储在具有错误数据类型的列中,对吧?! *{;-)
  • 是的,该列中不会有任何文字:)
  • 肯定不会,如果它被定义为一个数字! *{;-)
【解决方案2】:

聚合函数中的用例表达式。

例如

max(当 cola

min(cola) min_neg -- 这里不需要 case 表达式

SQL Fiddle

Oracle 11g R2 架构设置

Create table test(COLA number);

Insert into test values(1);
Insert into test values(50);
Insert into test values(-65);
Insert into test values(25);
Insert into test values(-2);
Insert into test values(-8);
Insert into test values(5);
Insert into test values(-11);

Create table test1(COLA varchar2(10));

Insert into test1 values('1');
Insert into test1 values('50');
Insert into test1 values('-65');
Insert into test1 values('25');
Insert into test1 values('-2');
Insert into test1 values('-8');
Insert into test1 values('5');
Insert into test1 values('-11');

查询 1

select
      max(case when cola < 0 then cola end) max_neg_cola
    , min(cola) 
    , min(case when cola > 0 then cola end) min_pos_cola
    , max(cola) 
from test

Results

| MAX_NEG_COLA | MIN(COLA) | MIN_POS_COLA | MAX(COLA) |
|--------------|-----------|--------------|-----------|
|           -2 |       -65 |            1 |        50 |

【讨论】:

  • q 2(是否添加了?),如其他地方所述,使用 TO_NUMBER()
【解决方案3】:

1) 现在我不确定如何获取其他两个值。

使用 CASE 表达式。

SQL> SELECT MAX(
  2    CASE
  3      WHEN cola >= 0
  4      THEN cola
  5    END) max_positive,
  6    MIN(
  7    CASE
  8      WHEN cola >= 0
  9      THEN cola
 10    END) min_positive,
 11    MAX(
 12    CASE
 13      WHEN cola < 0
 14      THEN cola
 15    END) max_negative,
 16    MIN(
 17    CASE
 18      WHEN cola < 0
 19      THEN cola
 20    END) min_negative
 21  FROM test;

MAX_POSITIVE MIN_POSITIVE MAX_NEGATIVE MIN_NEGATIVE
------------ ------------ ------------ ------------
          50            1           -2          -65

SQL>

2)与此同时,在尝试此操作时,我又有了疑问。当我有一些类型为 varchar2 的列并且它有数字作为值时。我正在本专栏中执行上述操作。正最大值与上述相同。但是负最小值很奇怪。

您需要先将 STRING 转换为 NUMBER,然后使用相同的查询。为了减少每次键入 to_number,您可以使用 WITH 子句。

注意此列中只能有数字,不能有字母数字。否则,请务必收到 ORA-01722: invalid number 错误。

SQL> WITH t AS
  2    ( SELECT to_number(cola) cola FROM test1
  3    )
  4  SELECT MAX(
  5    CASE
  6      WHEN cola >= 0
  7      THEN cola
  8    END) max_positive,
  9    MIN(
 10    CASE
 11      WHEN cola >= 0
 12      THEN cola
 13    END) min_positive,
 14    MAX(
 15    CASE
 16      WHEN cola < 0
 17      THEN cola
 18    END) max_negative,
 19    MIN(
 20    CASE
 21      WHEN cola < 0
 22      THEN cola
 23    END) min_negative
 24  FROM t;

MAX_POSITIVE MIN_POSITIVE MAX_NEGATIVE MIN_NEGATIVE
------------ ------------ ------------ ------------
          50            1           -2          -65

SQL>

【讨论】:

    【解决方案4】:

    要获得正的最小值,试试这个..

    select min(cola) from test where cola>0;
    

    要获得负最大值试试这个..

    select max(cola) from test where cola<0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2023-03-18
      相关资源
      最近更新 更多