こんにちは🐱
技術課の山本です。
初めて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';

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

