trdsql jq構文

Posted on:

これまでtrdsqlが対象とするJSONはフラットなJSONでした。そのためSQLの対象となるのはトップレベルのオブジェクトでした。

[
  {"age": "26", "name": "Tanaka"},
  {"age": "32", "name": "Suzuki"}
]

JSONは階層を深くすることができるので、さらに下の階層をSQLの対象としたい場合がありました。 SQLの関数を使用して、アクセスすることも出来ますが、少し面倒でした。

{
  "list": [
    {"age": "26", "name": "Tanaka"},
    {"age": "32", "name": "Suzuki"}
  ]
}

trdsqlではJSONに対し、まずjqの構文を使用して処理し、その結果に対してSQLを実行できます。 jqの構文はファイル名の後に"::“を付け、その後に書きます。 jqの構文なので、主に”.“ドットではじまり、中の値にアクセスします。


(jsonを対象とすると配列全体を1つの列と解釈してしまう)。

trdsql "SELECT * FROM example0-s.json"
"[{""age"":""26"",""name"":""Tanaka""},{""age"":""32"",""name"":""Suzuki""}]"

(listをテーブルとして解釈して、中のオブジェクトを列にする)。

trdsql "SELECT * FROM example0-s.json::.list
26,Tanaka
32,Suzuki

深い階層にアクセスしたいときは、jqの構文では .list.menu.itemのようにドットで繋いでいけば簡単にアクセスすることができます。 階層途中に配列があってもjqの構文([]等が含まれる場合は「"」で括る等してください)が書ければアクセスすることができます。

trdsql "SELECT * FROM example0-s.json::\".list[1].name\""

複雑な集計をjqで書くのは難しいため、対象をテーブル化することでSQLで集計するといったことができます。 また、CSVや他の形式に変換するのもtrdsqlでは簡単です。