如果字段1中的值不等于字段2中的值(其中field2包含一些空值),我试图在Oracle SQL中编写查询以返回行
如果表格看起来像这样
Field1 Field2
1 1
2 3
4
如果我使用此查询:
select * from table where field1 != field2
我只返回第2行,但不返回第3行。是否有一个查询我可以用来获取2,3行检索?
答案 0 :(得分:5)
如果field2
为NULL
,还请添加。你知道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)
此外,您可以使用COALESCE
将null
断言为另一个值。在这种情况下我使用了0。如果field1
或field2
没有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;