SQL的where子句不能区分“-”和NULL。
在SQL中,where子句不区分“-”和NULL之间的差异。这是因为NULL是一个占位符,用于表示缺少值。因此,无法使用“<>”或“!=”来比较NULL的值。相反,只能使用IS NULL或IS NOT NULL作为谓词来处理这种情况。
这种行为不仅限于SQL Server,所有符合标准的SQL方言都会以相同的方式工作。
要解决这个问题,可以使用IS NULL或IS NOT NULL来判断NULL值。下面是一个示例代码:
SELECT * FROM table_name WHERE column_name IS NULL;
上述代码将返回表中列值为NULL的所有行。
另外,如果要查找列值不为NULL的行,可以使用IS NOT NULL:
SELECT * FROM table_name WHERE column_name IS NOT NULL;
通过使用IS NULL和IS NOT NULL谓词,我们可以正确处理NULL值,并得到预期的查询结果。
SQL的WHERE子句在处理NULL值时不区分“-”和NULL。NULL值始终被排除在外,除非你明确地通过IS NULL包含它们。NULL表示未知。你不能用= NULL选择它们,也不能用<> NULL省略它们。与NULL的任何比较结果都不是true或false,而是未知。
解决这个问题的方法之一是使用以下语句:
SELECT A from table1 where A IS NULL OR A <> '-';
另一种方法是使用COALESCE函数:
SELECT A from table1 where COALESCE(A, '') <> '-';
NULL值从结果集中排除,除非你使用IS NULL或IS NOT NULL来请求它们。与NULL的比较(如你使用的NULL <> '-')将始终得到NULL而不是true/false。NULL既不等于也不不等于任何值,甚至不等于另一个NULL值。在某些RDBMS中,你可以关闭此行为,例如在SQL Server中使用SET ANSI_NULLS OFF。
更多详细信息,请参阅:https://en.wikipedia.org/wiki/SQL#Null_or_three-valued_logic_.283VL.29
感谢Tim,但我的问题不同。我正在使用条件A <> '-'(破折号),但是这个条件也排除了我的表中的NULL值。
是的,这就是我在我的回答中试图解释的。除非你使用IS NULL或IS NOT NULL来请求它们,否则NULL值永远不会包含在结果集中。与NULL的比较(就像你用NULL <> '-'所做的那样)将始终得到NULL而不是true/false。NULL既不等于也不不等于任何值,甚至不等于另一个NULL值。在一些RDBMS中,你可以通过SET ANSI_NULLS OFF来关闭这种行为,例如在SQL Server中。