【问题标题】:SQL Query - Get records with null values (but make sure they dont have any other records that match the key with a value)SQL 查询 - 获取具有空值的记录(但确保它们没有任何其他记录与键与值匹配)
【发布时间】:2019-07-29 15:12:25
【问题描述】:

所以我正在编写一个查询,我需要获取一个表中的所有记录,这些记录对于两个字段具有 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

【问题讨论】:

  • 样本数据和预期输出会有所帮助。

标签: sql sql-server group-by duplicates


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我会将having 子句表达为:

    HAVING COUNT(NULLIF(Postcode, '')) = 0 AND
           COUNT(NULLIF([File], '')) = 0 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2015-04-19
      • 2018-04-22
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多