Запрос SQL - Получить записи со значениями NULL (но убедитесь, что у них нет других записей, которые соответствуют ключу со значением) - PullRequest
0 голосов
/ 07 марта 2019

Итак, я пишу запрос, в котором мне нужно получить все записи в таблице, которые имеют нулевые или '' значения для двух полей ...

Файл и почтовый индекс.

Моя проблема в том, что у меня есть дубликаты записей, все запросы, которые я написал до сих пор, вернут мне запись с нулевым или '' файлом и полем почтового индекса, однако один из дубликатов (на основе поля электронной почты) имеет файл / почтовый индекс значение.

Мне нужно получить только те записи, где все экземпляры имеют нулевой файл / почтовый индекс

  SELECT DISTINCT EMAIL FROM Results R
  WHERE
    ( ISNULL(R.Postcode, '') = ''
        AND
      ISNULL(R.File, '') = ''
     )
    AND NOT EXISTS (
        SELECT Id FROM Results RR
        WHERE RR.Email = R.Email
        AND (
            ISNULL(R.Postcode, '') <> ''
            AND
            ISNULL(R.File, '') <> ''
        )
    )
    ORDER BY R.Email

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Слепой удар в темноте здесь, но я подозреваю a HAVING с условным агрегатом разрешит это:

SELECT Email
FROM Results
GROUP BY Email
HAVING COUNT(CASE WHEN Postcode IS NOT NULL AND Postcode != '' THEN 1 END) = 0
   AND COUNT(CASE WHEN [File] IS NOT NULL AND [File] != '' THEN 1 END) = 0;

Обратите также внимание, чтоЯ не использовал ISNULL (или COALESCE) в логике, но вместо этого использовал логическую логику.Это на самом деле важно, поскольку такие функции, как ISNULL, обернутые вокруг столбца в вашем WHERE, делают запрос не-SARGable;Это означает, что индексы в вашей таблице не могут быть использованы, чтобы помочь фильтру механизма данных в правильных строках, и вместо этого он должен выполнить полное сканирование данных.

0 голосов
/ 07 марта 2019

Я бы выразил предложение having как:

HAVING COUNT(NULLIF(Postcode, '')) = 0 AND
       COUNT(NULLIF([File], '')) = 0 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...