【问题标题】:Query in Access using NOT LIKE使用 NOT LIKE 在 Access 中查询
【发布时间】:2015-08-23 19:13:21
【问题描述】:

我正在使用如下查询。

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

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

【问题讨论】:

  • @Mackan:他在原始帖子中包含了 *... 但是 * 用于使文本变为斜体...
  • @luk2302 啊,我明白了。将恢复
  • 在原始帖子中是“LICENSE”,如果他不使用代码标签,这将是“LICENSE”斜体字 - 我也错过了编辑,认为这是一种误导首先编辑。

标签: sql ms-access sql-like


【解决方案1】:

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

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

您当前将选择记录“LICENSE”,因为它包含“LICENCE”,而记录“LICENCE”因为它包含“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) 并且具有非常不同的真值表:

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    

【讨论】:

    【解决方案2】:

    你应该检查你的条件。

    • 语句的第一个条件获取所有带有 [Material 描述]不包含“许可证”。所以我也给你 记录女巫包含“许可”。
    • 第二个条件为您提供所有带有 [Material 描述]不包含“许可”。所以你会得到记录 “许可证”也是如此。
    • 因为您使用 OR 操作,所以两个条件中的记录将 合并。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以使用包含字符范围的单个 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*';
        

        【讨论】:

        • 嗯,这也很好,我有点过于关注布尔逻辑:P
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-03
        • 2019-03-01
        • 1970-01-01
        • 2021-04-12
        • 2010-10-04
        • 1970-01-01
        • 2019-02-13
        相关资源
        最近更新 更多