postgresql 选择非重复值并按条件排除行

luaexgnf  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(151)

有一个表,列为category not nullsub_category default null

  • category始终设置
  • sub_category是可选的

我需要从表中选择distinct category,sub_category

  • 排除sub_category不为null且为null的记录
  • 如果只有一个category + <null>组合,请记录
category    sub_category  
girl_toys        fluffy
girl_toys        dolls
drawing          <null> -- keep it since only one null sub_category
paining          red_color
paining          <null> -- exclude since there is non null sub_category

字符串
预期结果:

category    sub_category  
girl_toys        fluffy
girl_toys        dolls
drawing          <null> -- keep is since drawing has only one null
paining          red_color -- <null> record excluded since there is non null sub_category exists

ddarikpa

ddarikpa1#

很多方法中的一种:

SELECT DISTINCT category, sub_category 
FROM   tbl t1
WHERE  sub_category IS NOT NULL
   OR  NOT EXISTS (
         SELECT FROM tbl t2
         WHERE  t2.category = t1.category
         AND    t2.sub_category IS NOT NULL
         );

字符串
我假设如果同一个category + null有多个示例,你也想保留一个副本。你实际上只想排除category + null,如果同一个category有另一个非空sub_category的行。至少这是你的“预期结果”所建议的。
如果表很大,并且每个(category, sub_category)有许多重复项,则可以使用模拟索引跳过扫描来优化性能。请参阅:

  • SELECT DISTINCT在PostgreSQL中的表上比预期的要慢

相关问题