SQL从具有空值的行数据中选择MIN值

时间:2012-08-17 16:45:16

标签: sql oracle

我在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来填充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
  )

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

4 个答案:

答案 0 :(得分: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或{ {1}}或其他任何有意义的东西。

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

答案 1 :(得分:1)

//如果您需要最小化COL1或COL(任何栏目)

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

请您详细说明我实际上无法帮助您处理这一小部分信息。

答案 2 :(得分: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的观点,我错过了。我认为如果用9999999替换NULLS而不是0,逻辑将起作用,尽管这可能对于此示例数据而言并非特定,而不是真实的解决方案。

答案 3 :(得分:0)

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

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