0

我在 Oracle 中的表是这样的

Col   Col1  Col2  Col3  ColR
--   ----  ----   ----  ---- 
30    73    40    null  -10
60    32    null  20     40
90    80    null  null   10
80    45    81    30     50

我也可以在上面的列中设置 0 而不是 null。我需要从 Col1、Col2、Col3 中找到最小值,忽略 null 或 0,并通过从 Col 中减去来填充 ColR。

编辑:我写了一个 CASE 语句,由于表中的空值而不起作用。

 SELECT col,col1,col2,col3,
  CASE
    WHEN Col1 < Col2 AND Col1  < Col3
    THEN Col - Col1
    WHEN Col2 < Col1 AND Col2  < Col3
    THEN Col - Col2
    ELSE Col - Col3
  END ColR
FROM
 (SELECT col,col1,
   CASE
    WHEN col22 IS NULL
    THEN NULL( i can also SET TO 0 but it will mess  WITH my other calculation TO find MIN)
      ELSE ROUND( 100* ( (col22) / (col44)))
    END col2 ,
    CASE
      WHEN col33 IS NULL
      THEN NULL
      ELSE ROUND( 100* ( (col33) / (col44)))
    END col3
  FROM TABLE
  )

我刚刚在我的选择查询中包含了 case 语句。所有的列值都是从另一个查询中填充的。

4

4 回答 4

2

听起来你想要类似的东西

SELECT least( (case when col1 is null or col1 = 0 then 999999999 else col1 end),
              (case when col2 is null or col2 = 0 then 999999999 else col2 end),
              (case when col3 is null or col3 = 0 then 999999999 else col3 end) )
  FROM <<table name>>

其中 999999999 是一个足够大的数值,它总是大于任何其他有效值。如果所有三列都有NULL或 0 值,那么您可能需要添加一个额外的检查,如果该least函数的结果是 999999999 您返回 0 或NULL其他任何有意义的值。

@X-Zero 非常友好地将这个构造的SQL Fiddle 示例放在一起。请注意,他的示例是过滤掉所有三列都具有NULL或 0 值的行。

于 2012-08-17T17:08:42.133 回答
1

// 如果您需要 COL1 或 COL(任何列)中的最小值

SELECT MIN (COL1) FROM (SELECT * FROM TABLE WHERE COL1 IS NOT NULL)

您能否详细说明一下,实际上我无法为您提供这一小部分信息。

于 2012-08-17T16:50:02.107 回答
1

Oracle NVL 用法:

nvl(check_expression, replacement_value)

因此, nvl(col2,0) 应该采用与您的数学相混淆的空值。

所以试试:

CASE
       WHEN nvl(col1,0) < nvl(col2,0) AND nvl(col1,0) < nvl(col3,0)
       THEN Col - nvl(col1,0)
       WHEN  nvl(col2,0) < nvl(col1,0) AND nvl(col2,0) < nvl(col3,0)
       THEN Col - nvl(col2,0)
       ELSE Col - nvl(col3,0)
END ColR 

编辑:我错过了 X-Zero 的观点。我认为,如果您将 NULLS 替换为 9999999 而不是 0,则逻辑将起作用,尽管这可能对该示例数据过于具体,而不是现实世界的解决方案。

于 2012-08-17T16:58:11.923 回答
0

如果要忽略列中的空值,可以使用 NVL 函数将它们包装起来。这会将列中的空值替换为指定的值,您可以为此使用一些大数字。例如:
NVL(col1,99999)

Oracle 数据库 SQL 参考 - NVL:http ://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm

于 2012-08-17T17:05:54.870 回答