Open1

NSEGで発表するduckdb紹介のプロット

ktz_aliasktz_alias

duckdb紹介

トピック打っとかなきゃ誰にも見つからへんやろ作戦

  • duckdb.org
  • 祝1.0リリース

特徴

構文

  • PostgreDQLのパーザがベース

    • 大体同じことができる
  • 独自拡張

    • select
      • JOIN拡張
        • asof join
          • 指定日以前の直近の日付の数値
          • SnowflakeやClickHouseでも使える模様
        • positional join
          • 実体はfull outer join
          • 欠損行はnullに
          • zip演算を思い浮かべるとわかりやすいかも
      • ソートして配列型に詰め込む集約関数
      • 配列・リスト型のラムダ式
      • 配列、リストのunnest
      • スター拡張
        • https://duckdb.org/docs/sql/expressions/star
        • columns
          • 正規表現による列名のパターンマッチ
          • ラムダ式
            • create table t (yobi001 varchar, ..., yobi256 varchar);
            • select columns( c -> substr(c, 5)::int between 10 and 20) from t;
        • exclude
          • 特定列だけ除外

          select * exclude(foo) from t;

        • replace
          • 特定列だけ変更できる
            • insert-selectで大活躍の予感

            insert into t2 select * replace(id*100 as id) from t1;

      • CSV, JSON等をパス指定でそのままselectできる(拡張子がある場合のみ)
      • from first syntax
        • from + where or from + selectのみ
        • from where selectはかけない残縁な子

          from (select * from t where id > 5) select id;
          select exists (from t where id > 5);

      • ケツカンマのサポート
      • order by でselect句の別名が指定できる
    • insert
      • insert or replace
        • なかったらinsertあったらupdate
        • PostgreSQLのon conflict doも使えるがより直感的
      • by name
        • snsert select で、いちいち位置を合わせなくても良くて便利
  • 独自Statement

できなかったこと

  • alter tableで主キーの変更

    • ctasでの致命的な致命傷
  • by nameでのinsert

    • エイリアスを付与すると、エイリアス込みの列名を探そうとしてエラー

    a.foo as foo

  • スカラ問い合わせ(サブクエリ)で複数行返す場合、先頭行返す

    • エラーにして欲しかった・・・

    select (select * from generate_series(1,10));

  • ネストしたderived tableで複数回、unnestするとデータが欠損(先頭行のみに)

  • JS/TSバインディング

    • パラメータの値としてArrayやObjectを渡せない
      • 渡せるのは、数値、文字列、boolean、nullのみ
      • IN句やANY句に渡す場合は展開する必要あり
      • CLIではできるのでバインディングの制限か?
    • 名前付きパラメータが使えない(位置パラメータのみ)
      • 順番変えたら地獄
    • インポートAPI使ったら、文字列->enum自動変換してくれなかった(0.10.1の時)
      • 今はしてくれるかも・・・(未確認)

DBメンテナンス