用配置单元查询结果中的特定值替换空值或null值

63lcw9qa  于 2021-06-02  发布在  Hadoop
关注(0)|答案(5)|浏览(353)

当查询不返回任何选定列的结果时,我试图显示一个默认值“others”。我给你举个例子。
此查询返回的值为空 os(agent) SO (第一行):

select country, os(agent) SO, count(*) from clicks_data
where country is not null and os(agent) is not null
group   by country, os(agent);

输出:

ZA           4
ZA  Android  4
ZA  Mac      8
ZA  Windows  5

相反,我想得到这个结果:

ZA  Others  4
ZA  Android 4
ZA  Mac     8
ZA  Windows 5

我的下一次尝试是这个查询,但它也没有真正起作用:

select country, regexp_replace(os(agent),'','Others') SO, count(*) from clicks_data 
where country is not null and os(agent) is not null 
group by country, os(agent);

结果如下:

ZA  Others  4
ZA  OthersAOthersnOthersdOthersrOthersoOthersiOthersdOthers 4
ZA  OthersMOthersaOtherscOthers 8
ZA  OthersWOthersiOthersnOthersdOthersoOtherswOtherssOthers 5
b5buobof

b5buobof1#

='' 也许是最简单的方法。例如。

CASE WHEN col='' THEN xxx ELSE yyy END 
     AS col_new;
lg40wkob

lg40wkob2#

合并将是最适合您的情况和最佳的解决方案
语法:coalesce(value,default\u value):当value为null或value时,函数返回默认值;
查询

SELECT country, COALESCE(os(agent),'Others') AS SO, COUNT(*) 
FROM clicks_data 
WHERE country IS NOT NULL AND os(agent) IS NOT NULL 
GROUP BY country, os(agent);

希望这能有效解决你的问题。

fafcakar

fafcakar3#

另一个可能的解决方案。如果您想在导出数据时简单地用一个空字符串替换所有空值,您可以这样做,方法是将 sed 命令sql的输出

$ hive -e 'set hive.cli.print.header=true; select * from db_name.table_name;' | sed 's/[\t]/,/g; s/^NULL,/,/g; s/,NULL,/,,/g; s/,NULL$/,/g;' > test.csv

信用

knsnq2tg

knsnq2tg4#

使用 LENGTH() 检查列值的长度。它返回>0,如果有其他值,则返回0作为空值或空值。
同时在中框显列值 CASE WHEN ... END
最终查询可能如下所示:

SELECT country, CASE WHEN LENGTH(os(agent)) > 0 THEN os(agent) ELSE 'Others' END AS SO, COUNT(*) 
FROM clicks_data 
WHERE country IS NOT NULL AND os(agent) IS NOT NULL 
GROUP BY country, os(agent);

希望这对你有帮助!!!

k4ymrczo

k4ymrczo5#

对于有类似问题的人,我想在这里总结一下。
嗯,这是一个比较老的问题。提供的sql过滤掉 NULL ,所以您只需要处理空字符串 "" . 但这与书名冲突,书名明确指出了两者 NULL 应该考虑空字符串。所以我还是用标题吧。 COALESCE 以及 NVL 仅适用于 NULL ,但对空字符串无效 "" .
两者 LENGTH 以及 !="" (以及 CASE WHEN )是可行的,因为它们与 NULL 以及 "" . 注意,当 = 操作是 NULL ,其计算结果为 NULL .
还有一件事需要注意的是我们应该在 GROUP BY 条款符合 SELECT 条款。我的意思是,当你 SELECT 像这样的表情 CASE WHEN... ,你应该 GROUP BY 同样的表情 CASE WHEN .
这会导致代码重复,这可以通过positionalias(从版本0.11.0开始可能)来改进。所以最后的问题可能是这样的:

--Only needed for version 0.11 through 2.1.x. 
SET hive.groupby.orderby.position.alias = true;  

SELECT
    country, 
    CASE 
        WHEN os(agent)!="" THEN os(agent)  --This also implies that it's not NULL.
        ELSE 'Others' 
    END AS SO, 
    COUNT(*) 
FROM clicks_data 
WHERE country IS NOT NULL 
GROUP BY 
    1, 2
;

相关问题