postgresql SQL -多个< >的失败条件

7xllpg7q  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(142)

可能是我错过了一些非常基本的东西。这是一个场景:

表格

  • T1

列:

  • id(UUID)
  • id_e(UUID)
  • 类别(VARCHAR)
SELECT COUNT(*)
FROM t1

| count |
|-------|
| 700000|

当搜索特定行时,将返回零行

SELECT COUNT(*)
FROM t1
WHERE id = '7ea67ae0-aef8-4944-bfb4-b9e04b42143a'::UUID
AND id_e = 'fa9763f5-c9e0-4de3-be57-ab3149fb1b9f'::UUID
AND category = 'A+'

| count |
|-------|
|      0|

当搜索任何不符合相同条件的行时,它返回的行数比第一个查询少

SELECT COUNT(*)
FROM t1
WHERE id <> '7ea67ae0-aef8-4944-bfb4-b9e04b42143a'::UUID
AND id_e <> 'fa9763f5-c9e0-4de3-be57-ab3149fb1b9f'::UUID
AND category <> 'A+'

| count |
|-------|
| 385221|

这个标准有什么问题?看起来它的行为类似于ORAND

6yoyoihd

6yoyoihd1#

您的标准

id = '7ea67ae0-aef8-4944-bfb4-b9e04b42143a'::UUID
AND id_e = 'fa9763f5-c9e0-4de3-be57-ab3149fb1b9f'::UUID
AND category = 'A+'

可以被否定为

NOT
(
id = '7ea67ae0-aef8-4944-bfb4-b9e04b42143a'::UUID
AND id_e = 'fa9763f5-c9e0-4de3-be57-ab3149fb1b9f'::UUID
AND category = 'A+'
)

德摩根定律

证明
A B NOT(A OR B)(NOT A)AND(NOT B):
I. A = 0,B = 0:

  • NOT(A或B)= 1
  • (NOT A)AND(NOT B)= 1

II. A = 0,B = 1:

  • NOT(A或B)= 0
  • (NOT A)AND(NOT B)= 0

III. A = 1,B = 0:

  • NOT(A或B)= 0
  • (NOT A)AND(NOT B)= 0

IV. A = 1,B = 1:

  • NOT(A或B)= 0
  • (NOT A)AND(NOT B)= 0

复合案例

让我们假设
A = A1和A2
我们要计算
非(A和B)。
所以:
NOT(A AND B)=
(NOT A)OR(NOT B)=
(NOT(A1和A2))或(非B)=
((NOT A1)OR(NOT A2))OR(NOT B)=
(NOT A1)或(非A2)或(非B)
因此
NOT(A AND B AND C)=(NOT A)OR(NOT B)OR(NOT C)
因此

NOT
(
id = '7ea67ae0-aef8-4944-bfb4-b9e04b42143a'::UUID
AND id_e = 'fa9763f5-c9e0-4de3-be57-ab3149fb1b9f'::UUID
AND category = 'A+'
)

等同于:

(
(NOT id = '7ea67ae0-aef8-4944-bfb4-b9e04b42143a'::UUID)
OR (NOT id_e = 'fa9763f5-c9e0-4de3-be57-ab3149fb1b9f'::UUID)
OR (NOT category = 'A+')
)

你犯了什么错
你想否定A和B和C,但你做了(不是A)和(不是B)和(不是C)。现在,让我们考虑A为假,但B和C为真的情况。在这种情况下,A AND B AND C和(NOT A)AND(NOT B)AND(NOT C)都将是假的,因此,它们显然不是彼此的否定。

相关问题