【发布时间】:2020-12-28 04:47:02
【问题描述】:
我有以下问题
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
因此,其中有 3 行和 Andrew,但只有一条记录带有 Marah。
如果我将查询更改为以下内容,则两个 Andrew Postings 将被正确排除
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 记录被排除在外吗?
【问题讨论】:
-
AND 在 OR 之前...
-
A AND B OR C AND D==(A AND B) OR (C AND D)。您需要放入括号以强制A AND (B OR (C AND D))。目前你有类似2 * 3 + 4 * 5的东西,当你想要类似2 * (3 + (4 * 5)) -
您的
WHERE转换为WHERE (client_id='mamasandpapas' AND UPPER(kw) LIKE '%MARAH%') OR (UPPER(kw) LIKE '%ANDREW%' AND UPPER(kw) NOT LIKE '%KOCH%')。这是你想要的吗? -
我想我只是愚蠢而忘记了 AND 在 OR 之前。这个查询是由 15 年前白痴写的代码生成的。