Athena における NULL と WHERE 句の使い方を少し調べてみた。

記事タイトルとURLをコピーする

こんにちは🐱
技術課の山本です。
初めてAthena のクエリで WHERE 句を使用した際に、少しハマったので書き残します。

まず、テーブル "test" を作成しました。

no (int型) kind (string型) name (string型)
1 fruits apple
2 fruits banana
3 fruits peach
4 fish tuna
NULL fish tunaNULL
fish tunaBrank
"" fish tuna""
8 "" ""
9
10 NULL NULL

S3 上の csv ファイルをテーブルとして読み込んでいます。

1,fruits,apple
2,fruits,banana
3,fruits,peach
4,fish,tuna
NULL,fish,tunaNULL
,fish,tunaBrank
"",fish,tuna""
8,"",""
9,,
10,NULL,NULL

テーブルの全情報を以下のクエリにて取得します。

SELECT * FROM test ;

結果:

no 列 (int 型) について、5 行目の NULL 、 6 行目の空白、7 行目の "" は、全て空白になっています。
kind , name 列 (String 型) について、8 行目、 9 行目、10 行目は、登録した通りになっています。

int 型の場合、NULL と 空白 と "" は NULL 扱いになる

no 列 (int 型) が NULL の行を取得してみると、空白"" も NULL 扱いのようです。

SELECT * FROM test WHERE no IS NULL;

no 列 (int 型) が NULL の行から no 列のみを取得して、重複排除してみました。

SELECT DISTINCT no FROM test WHERE no IS NULL;

やはり NULL 扱いですね。

no 列が NULL じゃない行も念のため出してみます。

SELECT * FROM test WHERE no IS NOT NULL;

想定通りです。

String 型の場合、NULL と 空白 と "" は登録した通りになる

確認してみます。

SELECT * FROM test WHERE kind = '';

➡️9行目のみ出ました。空白を空白として扱っているようです。

SELECT * FROM test WHERE kind = '""';

➡️10行目のみ出ました。"" を "" として扱っているようです。

SELECT * FROM test WHERE kind = 'NULL';

➡️11行目のみ出ました。NULL は NULL という文字列として扱っているようです。

まとめ

int 型の場合、NULL と 空白 と "" は NULL 扱いになりました。
String 型の場合、NULL と 空白 と "" は登録した通りになりました。
他の型については確認していないです。
また、ドキュメント SELECT - Amazon Athena の中では、WHERE 句において、IS NULL を指定できるとは書いてないものの、指定できました。
ここが一番驚いたポイントだったかもしれません。

LIKE や IN 、BETWEEN は使えるようでした。

LIKE

SELECT * FROM test WHERE kind LIKE 'frui%';

IN

SELECT * FROM test WHERE kind IN ('fruits','fish');

BETWEEN

SELECT * FROM test WHERE no BETWEEN 1 AND 8;

「=」「>」「<」「>=」「<=」「<>」「!=」 といった演算子も使えるようです。

SELECT * FROM test WHERE kind = 'fruits';

余談

リフレッシュに富士山を見に行ってきました。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)