如何根据条件获取列名
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 将成为只执行一次的数据库之一。以上是关于如何根据条件获取列名的主要内容,如果未能解决你的问题,请参考以下文章