我正在使用如下查询。
SELECT * FROM TableName
WHERE ([Material Description] Not Like "*LICENSE*" Or
[Material Description] Not Like "*LICENCE*");
但是,这会在“材料说明”字段中获取包含LICENSE或LICENSE记录的结果。请告知我缺少的是什么,这样我的查询就会在“材料描述”字段中省略包含这些单词的记录。
答案 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)
你应该检查你的条件。
结果是您从表中获得了所有记录。
答案 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*';