Запрос SELECT, где два поля НЕ совпадают, не работает - PullRequest
0 голосов
/ 30 мая 2019

У меня есть сценарий VBA, который просматривает таблицу, которая является объединением двух разных таблиц (a и b), где могут быть поля, которые не совпадают между таблицами (таблица aоригинал, таблица b - это та же таблица, но новый файл экспорта).

Цель состоит в том, чтобы найти, какие поля отличаются, и обновить одно поле в общем поле списком полей, которые не совпадают между двумя таблицами (a и b).

Но одно поле не проходит свой тест.Я попытался отдельно запросить эту таблицу, чтобы посмотреть, смогу ли я использовать простой запрос SQL, чтобы определить, распознает ли Access разницу.

Я не могу понять, почему это не работает, так как, если я пробую другие поля таким же образом, он возвращает ожидаемый результат.Я подтвердил, что оба поля имеют тип данных Short Text, оба поля имеют одинаковые «Общие свойства», «Свойства поиска», и «Таблица свойств» также совпадает не только между двумя полями, но и всеми другими аналогичными полями.

Этот запрос:

SELECT [a_Address 2], [b_Address 2]
FROM Staging_LOG_ExportDifferences
WHERE ID = 18;

Результаты в:

[a_Address 2] = (NULL)
[b_Address 2] = xasdf

Но когда я пытаюсь этот запрос:

SELECT *
FROM Staging_LOG_ExportDifferences
WHERE [a_Address 2] <> [b_Address 2];

Результаты в:

No results

Ответы [ 3 ]

0 голосов
/ 30 мая 2019

В качестве альтернативы вы могли бы использовать этот подход, не позволяя вам использовать несколько операторов if в VBA:

SELECT [a_Address 2], [b_Address 2]
FROM Staging_LOG_ExportDifferences
WHERE Len(Nz([a_Address 2],"")) <> Len(Nz([b_Address 2],""))
0 голосов
/ 30 мая 2019

Вы можете использовать это:

SELECT * 
FROM Staging_LOG_ExportDifferences
WHERE Nz([a_Address 2],'') <> Nz([b_Address 2],'');

Это предполагает, что ваши адреса не содержат пустых строк или, по крайней мере, вы считаете пустую строку "равной" NULL для сравнения. Как правило, я также использую Trim, чтобы убедиться, что любые ошибочные пробелы не вызывают проблем:

Trim(Nz([a_Address 2],'')) <> Trim(Nz([b_Address 2],''))
0 голосов
/ 30 мая 2019

Это семантика NULL. Он не проходит почти каждое сравнение - или, точнее, сравнение возвращает NULL, которое отфильтровывается вместе с FALSE.

Стандартный SQL имеет NULL -безопасное сравнение, IS DISTINCT FROM. Но MS Access не поддерживает это.

Итак, вы можете быть явным:

SELECT *
FROM Staging_LOG_ExportDifferences
WHERE ([a_Address 2] <> [b_Address 2]) OR
      ([a_Address 2] IS NULL AND [b_Address 2] IS NOT NULL) OR
      ([a_Address 2] IS NOT NULL AND [b_Address 2] IS NULL) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...