postgresql 为什么“NOT(table_name IS NOT NULL)”不等于“table_name IS NULL”?

oknwwptz  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(194)

我目前正在参加一个在线SQL课程。
在本模块中:
1.我的任务是识别数据集中的所有空行。
1.识别之后,请填入null来执行数据清除。

答案:此代码返回所有空项/行的列表。

  1. SELECT * FROM cprodsales2
  2. WHERE NOT(cprodsales2 IS NOT NULL)
  3. ;

我尝试过的:此代码不返回任何内容。空白。

  1. SELECT * FROM cprodsales2
  2. WHERE cprodsales2 IS NULL
  3. ;

我很困惑为什么两个代码不会返回相同的结果。

unguejic

unguejic1#

问题是您要比较的是整行,而复合表达式在IS NULLIS NOT NULL中的行为很奇怪:

  1. SELECT (1, NULL) IS NULL;
  2. ?column?
  3. ══════════
  4. f
  5. (1 row)
  6. SELECT NOT ((1, NULL) IS NOT NULL);
  7. ?column?
  8. ══════════
  9. t
  10. (1 row)

这是SQL标准所要求的。NULL和复合类型很奇怪。
如果所有组件均为NULL,则为IS NULL行类型。如果所有组件均不为NULL,则为IS NOT NULL行类型。其他任何行既不是NULL,也不是NOT NULL。
因此,WHERE NOT(cprodsales2 IS NOT NULL)将只传递那些至少有一列具有NULL值的表行。

展开查看全部

相关问题