SQL 括号

SQL Parenthesis

提问人:Edw4rd 提问时间:10/22/2021 最后编辑:forpasEdw4rd 更新时间:10/22/2021 访问量:88

问:

我在使用SQL表达式时遇到了问题,该表达式没有执行我认为它应该做的事情。

我有属于客户的工作,而且这些工作可能与某个项目有关,或者该项目将为空(如果它们与列中的项目有关,则显示为 int)。project_id

首先,我正在接受所有可用的工作,但是当项目为空时,我需要删除某些客户端。

我在子句中这样做:WHERE

AND (p4_.uid NOT IN (722, 4736, 1041, 735) AND s3_.project_id IS NULL)

但是SQL把它看作是两个分开的AND

AND p4_.uid NOT IN (722, 4736, 1041, 735) 
AND s3_.project_id IS NULL

例如,即使客户端分配了项目 ID 的作业,也不会显示来自具有 uid 735 的客户端的任何内容。

SQL 布尔逻辑 boolean-operations booleanquery

评论

1赞 Indrakumara 10/22/2021
添加示例数据和完整查询
1赞 GSerg 10/22/2021
让我重新表述你的问题。你有 ,你想知道为什么它表现得像 。它应该如何表现?AND (a > 1 AND b < 2)AND a > 1 AND b < 2
0赞 Edw4rd 10/22/2021
@GSerg 1º 的情况下,如果 a 同时> 1 和 b < 2,则需要 job,但在 2º 的情况下,它会占用每个具有 a>1 的作业和每个具有 b<2 的作业,即使它不是同时进行的。
0赞 GSerg 10/22/2021
@Edw4rd 中的外部甚至不影响 .从字面上看,您想知道为什么它不表现为 .在哪种情况下,“或”表示“或”?ANDAND (...)(...)a > 1 AND b < 2a > 1 OR b < 2AND

答:

1赞 forpas 10/22/2021 #1

但是当项目为空时,我需要删除某些客户端

此要求应写为:

AND NOT (p4_.uid IN (722,4736,1041,735) AND s3_.project_id IS NULL)

或等效的:

AND (p4_.uid NOT IN (722,4736,1041,735) OR s3_.project_id IS NOT NULL)

评论

0赞 Edw4rd 10/22/2021
谢谢,你能向我解释为什么这不起作用吗:AND (p4_.uid NOT IN (722,4736,1041,735) AND s3_.project_id IS NOT NULL)
0赞 forpas 10/22/2021
@Edw4rd 2 个布尔表达式中的每一个都应用于数据集的每一行,并且由于它们之间的运算符 AND,它们都必须返回 TRUE 才能通过它们的组合获得 TRUE。 过滤掉括号中的所有 UID,而不考虑project_id。 过滤掉所有具有 null project_id的 UID,而不考虑 UID。p4_.uid NOT IN (722,4736,1041,735)s3_.project_id IS NOT NULL