trdsql 簡単なSQL その2

Posted on:

検索条件

前回、列の並べ替え、抽出、行の並べ替えをしたので、今回は行の抽出です。 行を抽出するには、WHEREを付けて、検索条件を書きます。

前回と同じ例のファイルを使います。

trdsql -ih "SELECT id, \`name\` FROM header.csv WHERE id=1"
1,Orange

SQLのメインな機能ですね。検索条件を書くだけで、該当する行を出力できます。

AND, OR

AND や OR や ()括弧を使用することにより複雑な条件が書けます。

trdsql -ih "SELECT id, \`name\` FROM header.csv WHERE id='1' OR id='2'"
1,Orange
2,Melon
trdsql -ih "SELECT id, \`name\` FROM header.csv " "WHERE (id='1' OR id='2') AND \`name\`='Orange'"
1,Orange

前回にも書いたようにtrdsqlでは、CSVやLTSV、JSONの値をtext型として扱っています。そのため、「=」の条件で書いているときには、暗黙のCASTが効いて型をそれほど意識しなくても良いですが、範囲を指定するときには結果が変わってしまうので、CASTする必要があります。

trdsql -ih "SELECT id,\`name\` FROM header.csv " "WHERE CAST(id as int)>1"
2,Melon
3,Apple

SELECTを使用するときは、列の指定のところでCASTを使用して、そのCASTした列を指定して検索条件やORDER BYを書くことが出来ます。

その際には元の列名はCAST前の列を指しているので、AS 別名を使用してCAST後の列名を使用します(CAST後の列名に元の名前を付けることは出来ます)。

trdsql -ih "SELECT CAST(id AS int) AS id,\`name\` FROM header.csv WHERE id>1"
2,Melon
3,Apple

IN

WHEREの条件として、=や ‘>’、< の範囲指定以外にIN句が使用できます。 複数の指定をORでつないで書いていたのをIN句により簡潔に書くことができます。

trdsql -ih "SELECT * FROM header.csv WHERE id IN ('1','3')"
1,Orange
3,Apple

また、IN句の使い方として、列側を並べて書くことで、複数の列を一度に検索条件にできます。 例えば、idかnameに ‘Apple’がある行を検索できます。

trdsql -ih "SELECT * FROM header.csv WHERE 'Apple' IN (id,name)"
3,Apple