trdsql v0.10.0

Posted on:

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を止めて空文字("")で出力されます。