DuckDB in Actionを読んでいたら,Chapter.3 に SELECT * EXCLUDE
というシンタックスが出てきた.ほとんどのカラムが必要だけど,一部のカラムだけ除外したいときに使える.これは使える場面があるな〜と思って実際に試してみた❗️小ネタだけど検証ログを残しておく✍
データセット
DuckDB in Actionを読みながら試せるデータセットは GitHub に公開されている.
今回は ch03/ch03_db/prices.parquet
を使う.データ構造は以下のようになっている👌
⚫◗ DESCRIBE SELECT * FROM prices.parquet; ┌─────────────┬──────────────┬─────────┬─────────┬─────────┬─────────┐ │ column_name │ column_type │ null │ key │ default │ extra │ │ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │ ├─────────────┼──────────────┼─────────┼─────────┼─────────┼─────────┤ │ id │ INTEGER │ YES │ │ │ │ │ value │ DECIMAL(5,2)│ YES │ │ │ │ │ valid_from │ DATE │ YES │ │ │ │ │ valid_until │ DATE │ YES │ │ │ │ └─────────────┴──────────────┴─────────┴─────────┴─────────┴─────────┘
お試し1
まずは SELECT *
で全レコードを取得する.
⚫◗ SELECT * FROM prices.parquet; ┌───────┬──────────────┬────────────┬─────────────┐ │ id │ value │ valid_from │ valid_until │ │ int32 │ decimal(5,2) │ date│ date│ ├───────┼──────────────┼────────────┼─────────────┤ │ 1│ 11.59│ 2018-12-01│ 2019-01-01│ │ 10│ 11.47│ 2019-01-01│ 2019-02-01│ │ 11│ 11.35│ 2019-02-01│ 2019-03-01│ │ 12│ 11.23│ 2019-03-01│ 2019-04-01│ │ 13│ 11.11│ 2019-04-01│ 2019-05-01│ │ 14│ 10.95│ 2019-05-01│ 2019-06-01│ │ 15│ 8.60│ 2020-11-01│ 2023-01-01│ │ 16│ 8.60│ 2023-01-01│ 2024-02-01│ │ 17│ 8.64│ 2020-10-01│ 2020-11-01│ │ 18│ 8.77│ 2020-09-01│ 2020-10-01│ │ 19│ 8.90│ 2020-08-01│ 2020-09-01│ │ 20│ 9.03│ 2020-07-01│ 2020-08-01│ │ 21│ 9.17│ 2020-06-01│ 2020-07-01│ │ 22│ 9.30│ 2020-05-01│ 2020-06-01│ │ 23│ 9.44│ 2020-04-01│ 2020-05-01│ │ 24│ 9.58│ 2020-03-01│ 2020-04-01│ │ 25│ 9.72│ 2020-02-01│ 2020-03-01│ │ 26│ 9.87│ 2020-01-01│ 2020-02-01│ │ 27│ 9.97│ 2019-12-01│ 2020-01-01│ │ 28│ 10.08│ 2019-11-01│ 2019-12-01│ │ 29│ 10.18│ 2019-10-01│ 2019-11-01│ │ 30│ 10.33│ 2019-09-01│ 2019-10-01│ │ 31│ 10.48│ 2019-08-01│ 2019-09-01│ │ 32│ 10.64│ 2019-07-01│ 2019-08-01│ │ 33│ 10.79│ 2019-06-01│ 2019-07-01│ ├───────┴──────────────┴────────────┴─────────────┤ │ 25rows4 columns │ └─────────────────────────────────────────────────┘
お試し2
次に id
カラムを除外して全レコードを取得する.今回試す SELECT * EXCLUDE
を使わない場合は,個別に value
と valid_from
と valid_until
を指定する必要がある.今回のデータセットはカラム数が少なくて問題なく感じるけど,もっとカラム数が増えてくると,個別に指定する大変さがある💨
⚫◗ SELECT value, valid_from, valid_until FROM prices.parquet; ┌──────────────┬────────────┬─────────────┐ │ value │ valid_from │ valid_until │ │ decimal(5,2) │ date│ date│ ├──────────────┼────────────┼─────────────┤ │ 11.59│ 2018-12-01│ 2019-01-01│ │ 11.47│ 2019-01-01│ 2019-02-01│ │ 11.35│ 2019-02-01│ 2019-03-01│ │ 11.23│ 2019-03-01│ 2019-04-01│ │ 11.11│ 2019-04-01│ 2019-05-01│ │ 10.95│ 2019-05-01│ 2019-06-01│ │ 8.60│ 2020-11-01│ 2023-01-01│ │ 8.60│ 2023-01-01│ 2024-02-01│ │ 8.64│ 2020-10-01│ 2020-11-01│ │ 8.77│ 2020-09-01│ 2020-10-01│ │ 8.90│ 2020-08-01│ 2020-09-01│ │ 9.03│ 2020-07-01│ 2020-08-01│ │ 9.17│ 2020-06-01│ 2020-07-01│ │ 9.30│ 2020-05-01│ 2020-06-01│ │ 9.44│ 2020-04-01│ 2020-05-01│ │ 9.58│ 2020-03-01│ 2020-04-01│ │ 9.72│ 2020-02-01│ 2020-03-01│ │ 9.87│ 2020-01-01│ 2020-02-01│ │ 9.97│ 2019-12-01│ 2020-01-01│ │ 10.08│ 2019-11-01│ 2019-12-01│ │ 10.18│ 2019-10-01│ 2019-11-01│ │ 10.33│ 2019-09-01│ 2019-10-01│ │ 10.48│ 2019-08-01│ 2019-09-01│ │ 10.64│ 2019-07-01│ 2019-08-01│ │ 10.79│ 2019-06-01│ 2019-07-01│ ├──────────────┴────────────┴─────────────┤ │ 25rows3 columns │ └─────────────────────────────────────────┘
お試し3
そこで SELECT * EXCLUDE
を使うと,除外するカラムを指定できる👌
⚫◗ SELECT * EXCLUDE (id) FROM prices.parquet; ┌──────────────┬────────────┬─────────────┐ │ value │ valid_from │ valid_until │ │ decimal(5,2) │ date│ date│ ├──────────────┼────────────┼─────────────┤ │ 11.59│ 2018-12-01│ 2019-01-01│ │ 11.47│ 2019-01-01│ 2019-02-01│ │ 11.35│ 2019-02-01│ 2019-03-01│ │ 11.23│ 2019-03-01│ 2019-04-01│ │ 11.11│ 2019-04-01│ 2019-05-01│ │ 10.95│ 2019-05-01│ 2019-06-01│ │ 8.60│ 2020-11-01│ 2023-01-01│ │ 8.60│ 2023-01-01│ 2024-02-01│ │ 8.64│ 2020-10-01│ 2020-11-01│ │ 8.77│ 2020-09-01│ 2020-10-01│ │ 8.90│ 2020-08-01│ 2020-09-01│ │ 9.03│ 2020-07-01│ 2020-08-01│ │ 9.17│ 2020-06-01│ 2020-07-01│ │ 9.30│ 2020-05-01│ 2020-06-01│ │ 9.44│ 2020-04-01│ 2020-05-01│ │ 9.58│ 2020-03-01│ 2020-04-01│ │ 9.72│ 2020-02-01│ 2020-03-01│ │ 9.87│ 2020-01-01│ 2020-02-01│ │ 9.97│ 2019-12-01│ 2020-01-01│ │ 10.08│ 2019-11-01│ 2019-12-01│ │ 10.18│ 2019-10-01│ 2019-11-01│ │ 10.33│ 2019-09-01│ 2019-10-01│ │ 10.48│ 2019-08-01│ 2019-09-01│ │ 10.64│ 2019-07-01│ 2019-08-01│ │ 10.79│ 2019-06-01│ 2019-07-01│ ├──────────────┴────────────┴─────────────┤ │ 25rows3 columns │ └─────────────────────────────────────────┘
もちろん複数カラムを除外することもできる👌
⚫◗ SELECT * EXCLUDE (id, value) FROM prices.parquet; ┌────────────┬─────────────┐ │ valid_from │ valid_until │ │ date│ date│ ├────────────┼─────────────┤ │ 2018-12-01│ 2019-01-01│ │ 2019-01-01│ 2019-02-01│ │ 2019-02-01│ 2019-03-01│ │ 2019-03-01│ 2019-04-01│ │ 2019-04-01│ 2019-05-01│ │ 2019-05-01│ 2019-06-01│ │ 2020-11-01│ 2023-01-01│ │ 2023-01-01│ 2024-02-01│ │ 2020-10-01│ 2020-11-01│ │ 2020-09-01│ 2020-10-01│ │ 2020-08-01│ 2020-09-01│ │ 2020-07-01│ 2020-08-01│ │ 2020-06-01│ 2020-07-01│ │ 2020-05-01│ 2020-06-01│ │ 2020-04-01│ 2020-05-01│ │ 2020-03-01│ 2020-04-01│ │ 2020-02-01│ 2020-03-01│ │ 2020-01-01│ 2020-02-01│ │ 2019-12-01│ 2020-01-01│ │ 2019-11-01│ 2019-12-01│ │ 2019-10-01│ 2019-11-01│ │ 2019-09-01│ 2019-10-01│ │ 2019-08-01│ 2019-09-01│ │ 2019-07-01│ 2019-08-01│ │ 2019-06-01│ 2019-07-01│ ├────────────┴─────────────┤ │ 25rows2 columns │ └──────────────────────────┘