我在MS Access VBE中生成了一个正在运行的SQL查询...只是不完全正确。
查询如下:
SELECT *
FROM qryPOExamDetail
WHERE [Job Number]= '*' AND [LookUp] = '100M' OR [LookUp] = '120M' OR [LookUp] = '130M' OR [LookUp] = '140M' OR [LookUp] = '150M'
这将返回除'100M'
以外的所有记录。我究竟做错了什么?我整个下午都在玩括号,没有运气。
我刚刚更改了一些参数,它的工作原理如下:
SELECT * FROM qryPOExamDetail WHERE [Job Number]= 'C18TN02001' AND ([LookUp] = '100M' OR [LookUp] = '120M' OR [LookUp] = '130M' OR [LookUp] = '140M' OR [LookUp] = '150M')
其他两项更改:
SELECT * FROM qryPOExamDetail WHERE [Job Number]= 'C18TN02001' AND [LookUp] IN ('100M','120M')
以上方法有效,但是不能:
SELECT * FROM qryPOExamDetail WHERE [Job Number]= '*' AND [LookUp] IN ('100M','120M')
答案 0 :(得分:2)
出于可读性考虑,我倾向于按照Gordon Linoff的正确建议使用in
运算符,但要提供更简洁的选择,您也可以按以下方式使用like
运算符:
select * from qryPOExamDetail where [Job Number]= "*" and [LookUp] like "1[02345]0M"
还请注意:
[Job Number]= "*"
匹配Job Number
完全等于 *
,并且不使用星号作为通配符来匹配 all 可能的值Job Number
。
要匹配所有值,请对该字段也使用like
运算符,例如:
[Job Number] like "*"
原始查询返回所有内容的原因除了,其中LookUp = "100M"
是由于operator precedence引起的。
and
运算符的优先级高于or
运算符,这意味着您的原始查询...
SELECT *
FROM qryPOExamDetail
WHERE
[Job Number]= '*' AND [LookUp] = '100M'
OR [LookUp] = '120M'
OR [LookUp] = '130M'
OR [LookUp] = '140M'
OR [LookUp] = '150M'
...读取:
”从qryPOExamDetail
表中选择所有内容,其中Job Number
等于*
和LookUp
等于'100M'
,或者LookUp
等于'120M'
,或其中LookUp
等于'130M'
...“
在这里,运算符的优先级被松散地转换为上述句子中的标点符号。
因此,因为显然没有Job Number
值等于*
且LookUp
值等于'100M'
的记录,所以没有针对该条件组合返回任何记录
答案 1 :(得分:1)
我假设您的意思是查询(不是“字符串”),并且您打算使用的逻辑是:
SELECT *
FROM qryPOExamDetail
WHERE [Job Number]= '*' AND
[LookUp] IN ('100M', '120M', '130M', '140M', '150M');
您也可以使用括号来修正逻辑,但是IN
是更好的方法。
您可能还想更改引号:
WHERE [Job Number] = "*" AND
[LookUp] IN ("100M", "120M", "130M", "140M", "150M")
MS Access使用双引号分隔字符串,而不是单引号。