使用 NOT LIKE 在 Access 中查询

Query in Access using NOT LIKE

我正在使用如下查询。

SELECT * FROM TableName
WHERE ([Material Description] Not Like "*LICENSE*" Or 
       [Material Description] Not Like "*LICENCE*");

但是,这会在 Material 描述字段中获取包含 LICENSE 或 LICENSE 记录的结果。请告知我遗漏了什么,以便我的查询产生的结果省略了 Material 描述字段中包含这些词的记录。

没有通配符(* 在 MS Access 中,% 在大多数合理的数据库中),like 的行为类似于 = 运算符。如果要排除相关字段某处包含这些词的记录,只需用通配符将其括起来:

SELECT * 
FROM   TableName 
WHERE  ([Material Description] NOT LIKE '*LICENSE*' OR 
        [Material Description] NOT LIKE '*LICENCE*');

你应该检查你的条件。

  • 语句的第一个条件获取所有带有[Material的记录 说明] ​​不包含 "LICENSE"。所以我也给你 记录 包含 "LICENCE".
  • 第二个条件为您提供具有 [Material 的所有记录 说明] ​​不包含 "LICENCE"。所以你会得到记录 "LICENSE" 也是。
  • 因为您使用了 OR 运算,所以两种情况下的记录都将 合并。

结果是您从 table.

中获取了所有记录

你真正想要的是AND介于:

SELECT * FROM TableName
WHERE ([Material Description] NOT LIKE '*LICENSE*' AND 
       [Material Description] NOT LIKE '*LICENCE*');

您当前 select 记录 "LICENSE" 因为它 包含 "LICENCE" 而记录 "LICENCE" 因为它NOT 是否包含 "LICENSE".
您当前真正排除的记录是包含 "LICENCE" AND "LICENSE" 的记录,可能不多;)。这种小混乱是由 Or 与 Not 结合使用引起的。

实现相同目标的另一种方法是将 NOT 移到 ORed 条件前面:

SELECT * FROM TableName
WHERE NOT ([Material Description] LIKE '*LICENSE*' OR
           [Material Description] LIKE '*LICENCE*');

这样你实际想要达到的目标就更清楚了。
这将读作 NOT (A OR B) 而不是 (NOT A) OR (NOT B) 并且有非常不同的真相 table:

A  B  |  (  ~  A  )  &  (  ~  B  )
----------------------------------
0  0  |     1  0     1     1  0     
0  1  |     1  0     0     0  1     
1  0  |     0  1     0     1  0     
1  1  |     0  1     0     0  1 


A  B  |  ~  (  A  |  B  )
-------------------------
0  0  |  1     0  0  0     
0  1  |  0     0  1  1     
1  0  |  0     1  1  0     
1  1  |  0     1  1  1  

你的真相 table 看起来像

A  B  |  (  ~  A  )  |  (  ~  B  )
----------------------------------
0  0  |     1  0     1     1  0     
0  1  |     1  0     1     0  1     
1  0  |     0  1     1     1  0    
1  1  |     0  1     0     0  1    

您可以使用包含字符范围的单个 Like 模式来完成您需要的操作:

SELECT * FROM TableName
WHERE [Material Description] Not Like '*LICEN[CS]E*';

这意味着排除 [Material Description] 值包含 LICEN,后跟 的行CS,然后是 E。至少对我来说,它的意义比2个Not Like条件的组合更清楚。

如果可以将范围扩大到 LICEN,后面是任何单个字符,然后是 E,那就更简单了。合适的话,用?表示任意单个字符:

WHERE [Material Description] Not Like '*LICEN?E*';