【问题标题】:How can I filer out rows with NULL in PostgresQL?如何在 PostgresQL 中过滤掉带有 NULL 的行?
【发布时间】:2016-09-23 15:39:13
【问题描述】:

我加入了很多表,我的结果集如下所示:

  ID1 ID2 ID3
  -----------
  1   1   1
  1   1   NULL
  1   2   1
  1   2   2
  1   2   NULL
  1   3   NULL

仅当存在 ID1 和 ID2 相同的另一行时,我想忽略 ID3=NULL 的行,因此结果集应如下所示:

  ID1 ID2 ID3
  -----------
  1   1   1
  1   2   1
  1   2   2
  1   3  NULL

我希望使用不需要嵌套查询的聪明方法,但我还没有想出任何方法。用于过滤结果集中 ID3 值的 DISTINCT、MAX 等尚未完成。我要加入大约十几个表以获得结果集,因此提供源表定义有点困难。有人有什么建议吗?

提前致谢

【问题讨论】:

    标签: sql database postgresql null


    【解决方案1】:

    你可以使用窗口函数:

    select t.*
    from (select t.*, max(t.id3) over (partition by id1, id2) as maxid3
          from t
         ) t
    where maxid3 is null or id3 is not null;
    

    【讨论】:

      【解决方案2】:

      您可以将 OR 与 EXISTS 子句一起使用:

      SELECT m.ID1,
          m.ID2,
          m.ID3
      FROM MyTable m
      WHERE m.ID3 IS NOT NULL
          OR (m.ID3 IS NULL
              AND NOT EXISTS (SELECT 1 FROM MyTable s WHERE s.ID1 = m.ID1 AND s.ID2 = m.ID2 AND s.ID3 IS NOT NULL)
          )
      

      【讨论】:

        【解决方案3】:

        窗口函数的其他变体与计数更明确地说明您的选择条件:

        SELECT ID1, ID2, ID3 
        FROM (
         SELECT 
          t.*,
          COUNT(ID3) OVER(PARTITION BY (ID1, ID2)) AS n
         FROM myTable t
        ) ot 
        WHERE NOT (n > 0 AND ID3 IS NULL);
        

        【讨论】:

          【解决方案4】:

          另一种方法:

          with t(i1,i2,i3) as (values(1,1,1),(1,1,null),(1,2,1),(1,2,2),(1,2,null),(1,3,null))
          select
            i1,i2,
            unnest(coalesce(array_agg(i3) filter (where i3 is not null),array[null]::int[]))
          from t
          group by i1,i2;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-31
            • 1970-01-01
            • 1970-01-01
            • 2019-08-08
            • 2017-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多