SQL字符串让我发疯

时间:2019-05-09 18:05:11

标签: sql vba ms-access access-vba

我在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')

2 个答案:

答案 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使用双引号分隔字符串,而不是单引号。