SQL不在非等于查询上显示空值?

Ale*_*lue 39 sql oracle null

这只是一个好奇的问题,但我正在查看数据库并从一个表中提取数据,并在其中一个列上查询.列有四个可能的值null,0,1,2.当我运行查询时:

SELECT * FROM STATUS WHERE STATE != '1' AND STATE != '2';
Run Code Online (Sandbox Code Playgroud)

我得到与运行相同的结果:

SELECT * FROM STATUS WHERE STATE = '0';
Run Code Online (Sandbox Code Playgroud)

即在查询列的top命令中具有空值的行似乎从结果中省略,这是否总是在SQL中发生?

我正在通过Oracle SQL Developer运行我的命令.

Ale*_*lex 33

在几种语言中,NULL的处理方式不同:大多数人都知道二值逻辑,其中truefalse是布尔表达式中唯一可比较的值(即使是假定义为0,其他任何东西都是真的).

在标准SQL中,您必须考虑三值逻辑.NULL不被视为实际值,您可以将其称为"未知".因此,如果值未知,则不清楚在您的情况下state是0,1还是其他任何内容.所以,NULL != 1结果NULL一次.

这样就得出结论,无论您过滤掉可能为NULL的内容,都必须自己处理NULL值.请注意,语法也不同:NULL值只能与x IS NULL而不是比较x = NULL.请参阅Wikipedia以获取显示逻辑运算结果的真值表.


Gre*_*egM 9

是的,这是正常的,你可以把数据库设置固定下去

但是你可以修改你的代码并执行类似的操作:

SELECT * FROM STATUS WHERE STATE != '1' OR STATE != '2' or STATE is null;
Run Code Online (Sandbox Code Playgroud)

请查看此信息以获取更多信息:http: //www.w3schools.com/sql/sql_null_values.asp


Mic*_*ant 5

or的用where的会很快变得难以阅读和不确定其结果。

我建议额外加上括号INNOT IN在这种情况下),例如

SELECT * FROM STATUS WHERE (STATE NOT IN ('1', '2')) or STATE is null;

数据库供应商之间的示例可能会有所不同,但是上面的显式语法应确保结果正确。


Mad*_* Zu 5

NVL像这样使用:SELECT * FROM STATUS WHERE NVL(STATE,'X') != '1' AND NVL(STATE,'X')!= '2';