Sql Oracle查询:当只有一条记录存在时,其中NOT LIKE不排除记录

Sql Oracle查询:当只有一条记录存在时,其中NOT LIKE不排除记录,sql,oracle,oracle9i,Sql,Oracle,Oracle9i,我有以下疑问 select cand_id from cand_kw WHERE client_id='mamasandpapas' AND UPPER(kw) LIKE '%MARAH%' OR UPPER(kw) LIKE '%ANDREW%' AND UPPER(kw) NOT LIKE '%KOCH%' 数据库中有以下记录: Andrew Postings Andrew Postings Andrew McDee Marah Koch 所以有三行中有和Andrew,但只有一条记录

我有以下疑问

select cand_id 
from cand_kw
WHERE client_id='mamasandpapas' AND UPPER(kw) LIKE '%MARAH%' OR UPPER(kw) LIKE '%ANDREW%' AND UPPER(kw) NOT LIKE '%KOCH%' 
数据库中有以下记录:

Andrew Postings
Andrew Postings
Andrew McDee
Marah Koch
所以有三行中有和Andrew,但只有一条记录中有Marah

如果我将查询更改为以下内容,则两个Andrew帖子将被正确排除

select cand_id
from cand_kw
 WHERE client_id='mamasandpapas' AND UPPER(kw) LIKE '%MARAH%' OR UPPER(kw) LIKE '%ANDREW%' AND UPPER(kw) NOT LIKE '%POSTINGS%' 
因此,如果只存在一条记录,则返回结果,即使它们应该被排除

这是使用非常旧版本的Oracle(9i)和字段,其搜索(kw)代表关键字,是包含一组关键字的CLOB

这是一个非常古老的系统,不是我设计的


在第一种情况下,有人能解释为什么Marah Koch没有被排除在外,而Andrew Postings记录被排除在外吗?

大概,您打算这样做,其中条款:

WHERE client_id = 'mamasandpapas' AND
      (UPPER(kw) LIKE '%MARAH%' OR UPPER(kw) LIKE '%ANDREW%' AND UPPER(kw) NOT LIKE '%KOCH%')

但我不确定,因为您没有解释要实现的实际逻辑。也就是说,如果混合使用
以及
,请使用括号——至少在您真正理解运算符的优先级之前使用括号。

按照编写方式,不相似的“%KOCH%”仅在相似的“%ANDREW%”计算为True时才会计算。以下是您的原始WHERE条款关于Marah Koch记录的流程

第一个SQL检查客户端id是否为“mamasandpapas”。是的,太好了!接下来,它看到一个AND,这意味着它后面的任何内容都必须为真,WHERE子句才为真,幸运的是,Upper(kw)确实类似于“%MARAH%”。然后它看到或者下一个。SQL决定它可以忽略其余部分,因为如果OR两边的任何表达式的计算结果为true,那么它就完成了计算,因为像“%MARAH%”这样的Upper(kw)已经计算为true,所以它甚至不会像“%KOCH%”那样到达Upper(kw)

同样,在你的第二个WHERE子句示例中,它似乎只起作用,因为在Andrew Postings的情况下,在客户id求值为true之后,并且说如果Upper(kw)像“%MARAH%”,哦,不是,那么现在我们移到另一边,Upper(kw)像“%Andrew%”,但是等等,现在我看到了,这意味着Upper(kw)和像“%ANDREW%”一样,另一边的任何内容都必须为true,才能使WHERE为true。如果将记录添加到Marah Postings表中,则在第二个示例中仍将返回该记录


我为此学到的术语是“裸体者”。换言之,为了可读性和大多数人理解and和OR的逻辑,可能最好用括号“修饰”任何OR语句。

并在A和B或C和D之前或…
=
(A和B)或(C和D)
。您需要在括号中加上force
A和(B或(C和D))
。目前,当你想要
2*(3+(4*5))
你的
WHERE
翻译成
WHERE(client_id='mamasandpapas'和UPPER(kw)像'%MARAH%')或(UPPER(kw)像'%ANDREW%'和UPPER(kw)不像'%KOCH%')
。这就是你想要的吗?我想我只是在装傻,忘记了这一点,然后走在前面或后面。这个查询是由15年前白痴编写的代码生成的。