PostgreSQL 查询列上具有最小空值的行

Posted

技术标签:

【中文标题】PostgreSQL 查询列上具有最小空值的行【英文标题】:PostgreSQL query rows with least null value on columns 【发布时间】:2019-01-08 08:01:34 【问题描述】:

如何查询输出将是列上空值最小的行的行?

我的数据是:

ID         | col1     | col2      | col3      | col4     
-----------+----------+-----------+-----------+-----------
 1         | Null     |Null       | with value| with value
 2         |with value|Null       | with value| with value
 3         |with value|Null       | Null      | Null       

结果会是:

 ID         | col1     | col2      | col3      | col4     
 -----------+----------+-----------+-----------+-----------
  2         |with value|Null       | with value| with value  

因为 id 2 是空值最少的记录。 任何帮助将不胜感激。谢谢

【问题讨论】:

如果有更多行且空值数量同样少怎么办? 【参考方案1】:

你可以:

    按空值数(升序)对行进行排序 将行数限制为 1 (LIMIT 1)

您的代码:

SELECT *
FROM your_table
ORDER BY 
    CASE WHEN col1 IS NULL THEN 1 ELSE 0 END +
    CASE WHEN col2 IS NULL THEN 1 ELSE 0 END +
    CASE WHEN col3 IS NULL THEN 1 ELSE 0 END +
    CASE WHEN col4 IS NULL THEN 1 ELSE 0 END 
LIMIT 1

【讨论】:

这将返回具有 most 个空值的记录,这与 OP 要求的相反。另外,如果空列最少的行出现平局怎么办? 我认为它应该是相反的,如果它的 null 然后 0 否则 1 因为 OP 想要更少的 null 值 @APC,谢谢!我修好了它。关于“领带”,我对它的编码没有限制,OP不谈论这个。 欢迎好友:) 对空字符串使用= '' 而不是IS NULL【参考方案2】:

如果你只想要一行,那么你可以这样做:

select t.*
from t
order by ( (col1 is null)::int + (col2 is null)::int +
           (col3 is null)::int + (col4 is null)::int
         ) asc
fetch first 1 row only;

如果你想要所有这些行,我想我会这样做:

select t.*
from (select t.*,
             dense_rank() over 
                 (order by (col1 is null)::int + (col2 is null)::int +
                           (col3 is null)::int + (col4 is null)::int
                 ) as null_ranking
      from t
     ) t
where null_ranking = 1;

【讨论】:

以上是关于PostgreSQL 查询列上具有最小空值的行的主要内容,如果未能解决你的问题,请参考以下文章

在另一列上复制在某些条件下具有空值的列

SQL 中的 LISTAGG 返回具有空值的行

如何在具有空值的列上使用`jsonb_set`

PostgreSQL,删除具有重新编号列值的行

在 Hbase 中查找具有空值的行数

从SQL聚合行组合值并将NULL删除到单个行中