这只是一个好奇的问题,但我正在查看数据库并从一个表中提取数据,并在其中一个列上查询.列有四个可能的值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的处理方式不同:大多数人都知道二值逻辑,其中true和false是布尔表达式中唯一可比较的值(即使是假定义为0,其他任何东西都是真的).
在标准SQL中,您必须考虑三值逻辑.NULL不被视为实际值,您可以将其称为"未知".因此,如果值未知,则不清楚在您的情况下state是0,1还是其他任何内容.所以,NULL != 1结果NULL一次.
这样就得出结论,无论您过滤掉可能为NULL的内容,都必须自己处理NULL值.请注意,语法也不同:NULL值只能与x IS NULL而不是比较x = NULL.请参阅Wikipedia以获取显示逻辑运算结果的真值表.
是的,这是正常的,你可以把数据库设置固定下去
但是你可以修改你的代码并执行类似的操作:
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
多or的用where的会很快变得难以阅读和不确定其结果。
我建议额外加上括号IN(NOT IN在这种情况下),例如
SELECT * FROM STATUS WHERE (STATE NOT IN ('1', '2')) or STATE is null;
数据库供应商之间的示例可能会有所不同,但是上面的显式语法应确保结果正确。