我有一个形状图层,其属性包含NULL值,我想对其应用与NULL不同的值的过滤器。



使用可用的GUI进行此类查询构造,可以直观地尝试

"obj_art" != NULL




”的意思是“给我具有与NULL不同的属性“ obj_art”的所有功能”((这些绝对超过0)。从我的角度来看,测试此查询会产生一个奇怪的结果:


"obj_art" IS NOT NULL


问题是,!= NULLIS NOT NULL有什么区别?

评论

据我所知,这只是语法。当为null时,使用为或不是。否则使用=或!=

“一个人会直观地尝试”真的吗?为什么? NULL不是值。从字面上看,这是一个价值的缺失。您不能“等于” NULL!运算符!=并不表示“不是”;它的意思是“不等于”。 IS NOT表示“不是”,因此我认为这很直观:)

@LightnessRacesinOrbit如果没有理解NULL不是一个值,我会说尝试使用=或!=是很直观的,因为这是您评估任何其他值的方式。直到您知道NULL不是一个值,使用IS NOT而不是!=才是真正直观的。许多人不知道真正的NULL是什么。

而且,在GUI中,NULL在值列表中(如上),因此被视为“正常”值。而且没有按钮是NULL,还是我错过了?因此,当仅键入此类查询并具有知识时,就必须以特殊方式对待NULL,我们可以讨论直觉,但请确保不要在THIS GUI的上下文中使用。

@Midavalo:的确如此,我会谦虚地建议不要使用语言功能而不先查找它是什么:)通过猜测进行编程是行不通的。

#1 楼

免责声明:由于QGIS中的过滤语法可与SQL一起使用,因此我在此假定适用SQL规则。我不完全确定这是否完全正确,但似乎很合理,并且确实可以解释其行为。


该过滤器可与SQL一起使用,这就是为什么您必须在那里寻找答案的原因简而言之,当将逻辑运算符与null结合使用时,结果始终为null。但是,为了测试null,SQL附带了IS (NOT)比较功能,该功能允许将它用于您想要的过滤。 >

#2 楼

NULL不是值,因此不能等于=或不等于!=的任何值。它与作为值的零0不同。

NULL表示您正在查看的单元格中没有记录任何值。要检查值是否存在,请询问单元格IS NULL还是IS NOT NULL



IS NULL检查单元格是否为空

IS NOT NULL检查以查看单元格是否不为空

如果您有一些记录,这些记录的值分别为OneTwoThree和其余NULL,而您想查找所有非Two的内容,则需要使用类似

value != 'Two' OR value IS NULL

之类的方法,因为在equals / not equals查询中不会返回NULL值。如果仅使用value != 'Three',则结果将排除所有NULL记录,因为NULL的值不能相等或不相等。