trdsql 差分、比較

Posted on:

CSV同士やCSVとテーブルなどで、値の比較をしたい場合があります。

同じ形式で一部が違うCSVファイルであれば、diffを取る方法もありますが、trdsqlのSQLを使用して比較すると形式が違う場合の比較にも使用できます。

差分の出力

SQLで比較して、差分を出すには、EXCEPTを使用します。EXCEPTは Aのテーブルから Bのテーブルを引いた残りのAの内容を出力します。

Bの方に多くの行があっても関係なく、AにあってBにない行を出力します。

以下のCSVファイルで比較してみます。new.csvで、3の更新と4の追加があるCSVファイルです。

old.csv

1,AAA
2,BBB
3,CCC

new.csv

1,AAA
2,BBB
3,CCB
4,DDD

単純に全列を比較すると1と2の行が同じであるため、消されて残った3と4が出力されます。 この場合old.csv側にnew.csvにない行があっても出力されません。diffの比較とは違いますね。

trdsql "SELECT * FROM new.csv EXCEPT SELECT * FROM old.csv "
3,CCB
4,DDD

テーブルとファイルの差分出力

既存のデータベースに接続すれば、テーブルとの比較もできます。

例えば、trdsql DBインポートでインポートしたテーブルと更新されたCSVとの比較をしたいときには、以下のようにすると良いでしょう。

CSVファイル側をキャストして型を合わせています。

$ trdsql -driver postgres -dsn "dbname=trdsql_test" -ih -oh \
"SELECT id::int,name FROM fruits.csv " \
"EXCEPT " \
"SELECT id,name FROM fruits "
id,name
4,Grape

データベース側のテーブルが更新されて新しい場合は、逆にテーブル EXCEPT CSVファイルとすれば、良いでしょう。

共通の行の出力

また、EXCEPTとは逆に共通の行を出力させたいときには、INTERSECT を使用します。

$ trdsql -driver postgres -dsn "dbname=trdsql_test" -ih -oh \
"SELECT id::int,name FROM fruits.csv " \
"INTERSECT " \
"SELECT id,name FROM fruits"
id,name
1,Orange
2,Melon
3,Apple