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 │ ├───────┴──────────────┴────────────┴─────────────┤ │ 25 rows 4 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 │ ├──────────────┴────────────┴─────────────┤ │ 25 rows 3 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 │ ├──────────────┴────────────┴─────────────┤ │ 25 rows 3 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 │ ├────────────┴─────────────┤ │ 25 rows 2 columns │ └──────────────────────────┘