首页 > 解决方案 > SQL 查询 - 获取具有空值的记录(但确保它们没有任何其他记录与键与值匹配)

问题描述

所以我正在编写一个查询,我需要获取一个表中的所有记录,这些记录具有两个字段的 null 或 '' 值......

文件和邮政编码。

我的问题是我有重复的记录,到目前为止我写的所有查询都会返回一个带有 null 或 '' 文件和邮政编码字段的记录,但是其中一个重复项(基于电子邮件字段)确实有一个文件/邮政编码值。

我只需要获取所有实例都具有空文件/邮政编码值的那些记录

  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

标签: sqlsql-servergroup-byduplicates

解决方案


这里有点盲目,但我怀疑带有条件聚合的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会导致查询不可搜索;这意味着您的表上的索引不能用于帮助数据引擎过滤到正确的行,而是必须对数据执行全面扫描。


推荐阅读