選択した列の1つに対してクエリが結果を返さない場合、デフォルト値「その他」を表示しようとしています。例を示します。
このクエリは、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
LENGTH()
を使用して、列の値の長さを確認します。値がある場合は> 0を返し、それ以外の場合は空またはNULL値の場合は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);
これがあなたを助けることを願っています!!!
COALESCEはあなたのケースに最適で最適なソリューションです
構文: COALESCE(VALUE、DEFAULT_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);
これがあなたの問題の効率的な解決策になることを願っています。
=''
おそらく最も簡単な方法です。例えば.
CASE WHEN col='' THEN xxx ELSE yyy END
AS col_new;
別の可能な解決策。データをエクスポートするときに、すべてのNULL値を空の文字列で単純に置き換える場合は、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
同様の問題を抱えている人のために、ここで要約したいと思います。
まあ、これは比較的古い質問です。提供されたSQLはNULL
を除外するため、処理する必要があるのは空の文字列""
だけです。ただし、これは、NULL
と空の文字列の両方を考慮する必要があることを明確に示しているタイトルと競合します。タイトルにこだわります。
COALESCE
およびNVL
はNULL
に対してのみ機能しますが、空の文字列""
に対しては機能しません。
LENGTH
と!=""
は、NULL
とCASE WHEN
と互換性があるため、両方とも""
とともに使用できます。 =
操作のパラメーターの1つがNULL
である場合、NULL
と評価されることに注意してください。
もう1つ注意すべき点は、GROUP BY
句の式をSELECT
句の式に準拠させる必要があることです。つまり、SELECT
のような式をCASE WHEN...
とすると、同じ式をGROUP BY
CASE WHEN
する必要があります。
これによりコードの繰り返しが発生しますが、これはposition aliasで改善できます(バージョン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
;