SQL-строка сводит меня с ума - PullRequest
2 голосов
/ 09 мая 2019

У меня есть SQL-запрос, сгенерированный в MS Access VBE, который работает ... просто не совсем так, как должен.

Запрос выглядит так:

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 ]

2 голосов
/ 09 мая 2019

Для удобства чтения я был бы склонен использовать оператор in, как правильно предложил Гордон Линофф, но чтобы предложить более лаконичную альтернативу, вы также можете использовать like оператор следующим образом:

select * from qryPOExamDetail where [Job Number]= "*" and [LookUp] like "1[02345]0M"

Также обратите внимание, что:

[Job Number]= "*"

Соответствует Job Number , точно равному *, и не , использующий звездочку в качестве оператора подстановки для сопоставления всех возможных значений Job Number.

Чтобы сопоставить все значения, используйте like оператор для этого поля, например:

[Job Number] like "*"

Причина, по которой исходный запрос возвратил все , кроме , где LookUp = "100M" связано с приоритет оператора .

Оператор 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 голос
/ 09 мая 2019

Я предполагаю, что вы имеете в виду запрос (не "строка") и что логика, которую вы намереваетесь:

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 использует двойные кавычки для разделения строк, а не одинарные.

...