使用 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
移到 OR
ed 条件前面:
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,后跟 的行C 或 S,然后是 E。至少对我来说,它的意义比2个Not Like
条件的组合更清楚。
如果可以将范围扩大到 LICEN,后面是任何单个字符,然后是 E,那就更简单了。合适的话,用?
表示任意单个字符:
WHERE [Material Description] Not Like '*LICEN?E*';
我正在使用如下查询。
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
移到 OR
ed 条件前面:
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,后跟 的行C 或 S,然后是 E。至少对我来说,它的意义比2个Not Like
条件的组合更清楚。
如果可以将范围扩大到 LICEN,后面是任何单个字符,然后是 E,那就更简单了。合适的话,用?
表示任意单个字符:
WHERE [Material Description] Not Like '*LICEN?E*';