Mysql 不等于的SQL不会返回空结果

Mysql 不等于的SQL不会返回空结果,mysql,sql,Mysql,Sql,返回结果: table 'materials' id sku content 10 IT2 Iron 11 IT3 Steel 12 IT4 Steel 13 IT5 NULL 14 IT6 Iron 15 IT7 Glass select id, sku, content from materials where content !='Iron'; 为什么结果集中没有返回带有NULL值的id 13?使用MYSQL。根据where子句,它

返回结果:

table 'materials'
id   sku  content
10   IT2   Iron
11   IT3   Steel
12   IT4   Steel
13   IT5   NULL
14   IT6   Iron
15   IT7   Glass

select id, sku, content from materials where content !='Iron';
为什么结果集中没有返回带有NULL值的id 13?使用MYSQL。

根据where子句,它比较null!='Iron’,根据SQL的三向逻辑,它的计算结果是未知的,既不正确也不错误。因此,查询不会返回它

如果需要生成空行,则应使用

id   sku   content
11   IT3   Steel
12   IT4   Steel
15   IT7   Glass
编辑:另一个选项是使用关系空安全相等运算符和否定

where content !='Iron' or content is null
根据文件

空安全相等。此运算符执行与=运算符类似的相等比较,但如果两个操作数都为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL

该运算符与标准SQL运算符等效,但与标准SQL运算符不同

返回

mysql> 
   SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL
   UNION
   SELECT 1 = 1, NULL = NULL, 1 = NULL;
   

这将把空字符串转换为空字符串。

您可以。。。。其中,聚合内容,'HandleNull'!='Iron“coalesce”将采用第一个非空值,但在这种情况下,“HandleNull”将成为特殊的边缘情况;如果任何内容值都等于“HandleNull”,那么您就不会得到这些值。xQbert-这也可以很好地工作。我看到handleNull是一个占位符,可以是任何你知道不可能的结果。是否将所有空值都转换为0?coalesce从一系列值中返回第一个非空值。所以在这种情况下,如果内容为null,它将返回“HandleNull”,这可能不等于您可能的结果。但是,如果内容有一个值,它只会将该值与!='铁'它并没有真正把他们变成0。我找不到mySQL是如何处理空集的,它可能也可以工作。@xQbert感谢这种解决方法,它对我动态构建where子句的情况有很大帮助,在需要的地方添加“xyz is null”非常困难。我知道SQL的这一特性是经过设计的,但我个人认为这是一个愚蠢的设计决定,99%的时候人们希望为NULL“铁”回归真实;因此,它应该被设计为返回人们期望它返回的内容。在PG错误:运算符不存在:整数提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。@Al Mothafar我希望您看到问题是用mysql标记的?@CoderinoJavarino大多数SQL DBMS都使用相同的语法,运算符通常是相同的,所以我只是根据我在PG中的经验发表了评论,不仅是用mysql标记的问题,甚至答案都是mysql>
mysql> 
   SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL
   UNION
   SELECT 1 = 1, NULL = NULL, 1 = NULL;
   
  1 vs 1  |  NULL vs NULL  | 1 vs NULL |  Comment
  --------------------------------------------------
     1    |        1       |    0      |  for <=>
     1    |       NULL     |   NULL    |  for  =
ISNULL(content, '') = 'Iron'