如何根据条件获取列名

Posted

技术标签:

【中文标题】如何根据条件获取列名【英文标题】:How to get column name based on condition 【发布时间】:2020-08-15 02:40:07 【问题描述】:

我有以下查询来检查列是否为空

select 
    sum(case when Column_1 is null then 1 else 0 end) as Column_1, 
    sum(case when Column_2 is null then 1 else 0 end) as Column_2, 
    sum(case when Column_3 is null then 1 else 0 end) as Column_3,
from TestTable 

它给出:

Column_1  Column_2  Column_3
0         1         0

我想获取具有空值的列名 所以我想要的输出是:

Column_1
Column_3

如何在 Presto 中做到这一点?从查询返回的输出列名似乎并不容易。

【问题讨论】:

【参考方案1】:

我了解您希望将结果放在单独的行而不是串联字符串中。

如果是这样,您可以使用 unnest() 和数组取消透视现有结果集;

select t2.key
from (
    select 
        sum(case when Column_1 is null then 1 else 0 end) as Column_1, 
        sum(case when Column_2 is null then 1 else 0 end) as Column_2, 
        sum(case when Column_3 is null then 1 else 0 end) as Column_3
    from TestTable 
) t1
cross join unnest(
    array['Column1', 'Column_2', 'Column_3'],
    array[Column1, Column_2, Column_3]
) t2 (key, value)
where t2.value = 0

【讨论】:

【参考方案2】:

一种方法是:

select (case when count(column_1) <> count(*) then 'Column_1;' else '' end) ||
       (case when count(column_2) <> count(*) then 'Column_2;' else '' end) ||
       (case when count(column_3) <> count(*) then 'Column_3;' else '' end)
from TestTable  ;

【讨论】:

不确定我是否理解该查询?计数(column_1)计数(*)?如果表是空的会怎样? @HaloKu。 . .有趣的问题。那么这两个计数都将是0,并且该列将(正确地)不被识别为具有NULL 值。 谢谢。在性能方面。如果我有 50 列。它是否执行 50 次 count(*) ?还是对所有情况只评估一次? @Haloku 。 . .没关系。 count(*) 不是查询的昂贵部分;读取数据是。我希望 Presto 将成为只执行一次的数据库之一。

以上是关于如何根据条件获取列名的主要内容,如果未能解决你的问题,请参考以下文章

如何也使用 where 条件从表中获取列名

如何根据一组列名获取数据库对象列表?

layui数据表格如何根据列名修改整列的值?

如何从 SQL 表中动态获取单元格值?

Python Pandas:如何根据“OR”条件进行合并?

如何从 SPARK SCALA 中的 XML 模式中获取列名?