使用NOT LIKE在Access中查询

时间:2015-06-09 06:02:34

标签: sql ms-access sql-like

我正在使用如下查询。

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

但是,这会在“材料说明”字段中获取包含LICENSE或LICENSE记录的结果。请告知我缺少的是什么,这样我的查询就会在“材料描述”字段中省略包含这些单词的记录。

4 个答案:

答案 0 :(得分:4)

你真正想要的是AND介于两者之间:

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

您目前将选择记录" LICENSE"因为 NOT 包含" LICENSE"和记录"许可证"因为 NOT 包含" LICENSE" 您当前真正排除的记录是包含" LICENSE" AND " LICENSE",可能并不多;)。使用Or与Not结合使用会产生一点点混淆。

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

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

这样你实际想要达到的目标就更清楚了一点 这将读取NOT (A OR B)而不是(NOT A) OR (NOT B),并且具有非常不同的真值表:

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  

你的真相表看起来像

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    

答案 1 :(得分:2)

你应该检查你的条件。

  • 语句的第一个条件获取所有记录[Material 说明]不包含" LICENSE"。所以我也给你了 记录女巫包含" LICENSE"。
  • 第二个条件为您提供了所有记录[Material 说明]不包含" LICENSE"。因此,您将获得记录 " LICENSE"太
  • 因为你使用OR操作,两个条件的记录都会 合并。

结果是您从表中获得了所有记录。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您可以使用包含字符范围的单个Like模式执行所需操作:

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

这意味着排除 [Material Description] 值包含 LICEN 的行,然后是 C S ,然后是 E 。至少在我看来,它的含义比2 Not Like条件的组合更清晰。

如果您可以将范围扩展到 LICEN ,然后是任何单个字符,然后是 E ,那就更简单了。这是合适的,使用?来表示任何单个字符:

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