trdsql v0.10.0
trdsql v0.10.0をリリースしました。
リリースのページから各バイナリがダウンロードできます。
NULLの扱い変更
今回はNULLの扱いを変更しました。
JSONにはnull
がありましたが、CSV等のテキストフォーマットには無いため、
すべて空文字として扱っていましたが、JSONのnull
をSQLのNULL
として扱うようにしました。
JSONの文字列とみなせる箇所がnull
の場合は、それほど問題ではありませんでしたが、
配列("[]")のようなJSONが入る箇所がnull
の場合に空文字("")にしてしまうと、
SQLのJSON関数に渡しづらい問題があったためSQLのNULL
にするようにしました。
これによりJSONの集計問題が解きやすくなっていると思います。
Introducing zqで示されている問題にSQLで解くときにスッキリ書けるようになっています。
上記の"A Practical Example"は、以下のSQLで解けます。
SELECT json(author_name)->>0 AS author_name, count(*) AS count
FROM openlibrary.json::.docs
WHERE author_name IS NOT NULL AND publish_year IS NOT NULL
GROUP BY json(author_name)->>0
ORDER BY count DESC LIMIT 3;
{"author_name":"S. Stepniak","count":38}
{"author_name":"Władysław Stępniak","count":7}
{"author_name":"Władysław Stępniak","count":4}
Unicodeの正規化はPostgreSQLエンジンを使用する場合はnormalize()
関数があるため、間に入れれば可能です。SQLite3エンジンを使用する場合は、
別のコマンドで正規化してからパイプで使用する必要があります。
jq .docs openlibrary.json| uconv norm | trdsql -driver sqlite3 -ijson -ojsonl
"SELECT json(author_name)->>0 AS author_name, count(*) AS count
FROM - WHERE author_name IS NOT NULL AND publish_year IS NOT NULL
GROUP BY json(author_name)->>0
ORDER BY count DESC LIMIT 3"
NULLオプション追加
また、-inull
と-onull
オプションを追加しました。-inull
はSQLのNULLに変換する文字列を指定し、
-onull
はSQLのNULLを指定された文字列に変換します。
CSV等のフォーマットでは、主に空文字("")をNULLにするときに使用します。
また、出力するときに -onull "\N"
にしておくとPostgreSQLのCOPY文に適したフォーマットにできます。
JSONで-inull ""
はnull
に加えて空文字をNULLに変換することもできます。-onull ""
にするとnullを止めて空文字("")で出力されます。