sql比较字段与一些空值

时间:2017-09-12 20:41:03

标签: sql oracle

如果字段1中的值不等于字段2中的值(其中field2包含一些空值),我试图在Oracle SQL中编写查询以返回行

如果表格看起来像这样

Field1    Field2
1         1
2         3
4         

如果我使用此查询:

select * from table where field1 != field2

我只返回第2行,但不返回第3行。是否有一个查询我可以用来获取2,3行检索?

5 个答案:

答案 0 :(得分:5)

如果field2NULL,还请添加。你知道null不是匹配但想要显示它。

SELECT * FROM table 
WHERE field1 != field2
    OR (field1 IS NULL AND field2 IS NOT NULL)
    OR (field1 IS NOT NULL AND field2 IS NULL)

此外,您可以使用COALESCEnull断言为另一个值。在这种情况下我使用了0。如果field1field2没有0,则仅使用0。基本上选择一个不会在你的桌子上发生的价值。

select * from table where COALESCE(field1, 0) != COALESCE(field2, 0)

编辑:OP断言field1可能为null,因此我更改了第一个查询。查询1对进行的操作更加清楚,查询2是一种更简洁的方法来实现相同的最终结果。

在此处阅读更多内容:COALESCE Function in TSQL

您还可以使用NVL()来处理NULL COALESCE,但这对我的理解效率较低。更多信息:Oracle Differences between NVL and Coalesce

答案 1 :(得分:0)

select * 
  from table  
 where field1 != field2
    or (field1 IS NOT NULL AND field2 IS NULL)
    or (field1 IS NULL AND field2 IS NOT NULL)

答案 2 :(得分:0)

如果您想排除这两个字段为null的行(如您在评论中所示),那么您可以使用

select *
from   <table>
where  decode(field1, field2, 1, 0) = 0
;

这利用了decode的特殊定义。它返回第三个参数(在本例中为1),如果是field1 = field2,则返回null时(与#34;#34; SQL中null的正确处理相反) 。在所有其他情况下,它返回0,这是你想要的。

答案 3 :(得分:0)

您已经在这里得到了一些正确答案,但这里有另一个您可能更喜欢的答案:

select * from table where field1 != nvl(field2,-field1);

请告诉我们它是否适合您。如有任何进一步的澄清,请不要再犹豫了。

泰德

答案 4 :(得分:0)

您可以使用 case 语句在重新定义的句子中测试是否相等。此表达式永远不会求值为null,因此可以在其上应用 not 并获取互补行。

select * from my_table
where 
not case 
  when field1=field2 then 1
  when field1 is null and field2 is null then 1
  else 0
end = 1;