我在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语句。所有列值都从另一个查询填充。
答案 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