SQL的where子句不能区分“-”和NULL。

28 浏览
0 Comments

SQL的where子句不能区分“-”和NULL。

这个查询排除了-和空值。为什么也排除了空值?

0
0 Comments

在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值,并得到预期的查询结果。

0
0 Comments

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中。

0