SQL实现:将含'NO'值的列名输出至新增output列
问题:根据列值为NO的情况显示对应列名作为输出列
源数据
a |b |c |d | ---+---+---+---+ YES|YES|NO |YES| NO |YES|NO |NO | NO |NO |YES|YES| YES|YES|YES|NO |
期望输出
a |b |c |d |output | ---+---+---+---+--------+ YES|YES|NO |YES|C | NO |YES|NO |NO |A |C |D | NO |NO |YES|YES|A |B | YES|YES|YES|NO |D |
需求说明:新增的output列需根据'NO'值显示对应列名——第1行中C列值为NO,故output列显示C;第2行中A、C、D列值为NO,故output列显示A | C | D。
尝试的查询语句
select A,B,C,D ,concat_ws('|',nullif(A,'YES'),nullif(B,'YES'),nullif(C,'YES'),nullif(D,'YES')) as output from test.tab
问题:该查询输出的是'NO'值,而非对应的列名,如何调整实现需求?
解决方案
核心思路:当列值为NO时返回对应的列名,否则返回null,再用concat_ws连接非空值(concat_ws会自动忽略null)。
调整后的查询语句:
select A, B, C, D, concat_ws(' | ', case when A = 'NO' then 'A' end, case when B = 'NO' then 'B' end, case when C = 'NO' then 'C' end, case when D = 'NO' then 'D' end ) as output from test.tab
说明
- 用
case表达式替代原来的nullif:判断每个列的值是否为NO,若是则返回列名,否则返回null; concat_ws(' | ', ...)会将所有非null的列名用|分隔拼接,自动过滤掉null值,正好匹配需求中只显示值为NO的列名的要求。
内容的提问来源于stack exchange,提问作者Learn Hadoop
相关产品推荐
相关产品推荐

