こんにちは🐱
技術課の山本です。
初めて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';
余談
リフレッシュに富士山を見に行ってきました。
山本 哲也 (記事一覧)
カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。
今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。
山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。
基本的にのんびりした性格です。座右の銘は「いつか着く」