ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

PostgreSQL where句

where句を使って条件つきの検索を試す。
データはこれまでにつくったtestデータベース、testsテーブルに入っているボートレース(レガッタ)の結果を使う。

目次


PostgreSQLドキュメント

SQLコマンドについてはPostgreSQLドキュメント内のリファレンスに詳細が載っている。
さらにSQLコマンド > select文とすすむとwhere句について書かれている。

PostgreSQLドキュメント
リファレンス SQLコマンド
select文where句
https://www.postgresql.jp/document/10/html/sql-commands.html

SQLファイルをつくる

SQL文が長くなるので今回も外部ファイルを読み込む方法を使う。
次のようなファイルをつくる。

select_where.sql

select
    raceno,
    events,
    groups,
    rank1,
    crew_rank1,
    rank2,
    crew_rank2,
    rank3,
    crew_rank3
from tests where
    crew_rank1 = 'A大学' or
    crew_rank2 = 'A大学' or
    crew_rank3 = 'A大学'
;


上のselect文の説明。

  • selectコマンドにつづいて表示したいカラムの名称を書く
  • fromにつづいてテーブル名を書く
  • whereにつづいて条件を書く
    • 今回はクルー名がA大学のレコードを検索
    • 条件は複数つけられる。今回はorでつなげている


SQLファイルを実行する

ターミナル/PowerShellから次の順でコマンドを実行する。

  1. PostgreSQLサーバーを起動 -pg_ctlコマンドを使用
  2. データベースに接続
    • psqlコマンドを使用
    • 今回はtestという名のデータベースに接続
  3. カラム数が多いので拡張表示をオンにして縦表示にする
    • \xコマンドを使用
  4. ファイルを読み込む
    • \i ファイル名コマンドを使用
    • 読み込むとファイルに書かれたコマンドが実行される


1から3の詳細は前に書いた記事を参照。

実行結果

実際にファイルを読み込む。

\i select_where.sql

実行結果
今回からmacOS10の結果のみ紹介。
(Windows10の結果は特に違いがある場合のみ紹介)

f:id:rowingfan:20180420092536p:plain

希望どおりA大学が含まれるレース結果だけが表示された。

Windows10の文字エンコーディング

Windows PowerShellの環境によっては外部ファイルが正しく読み込まれない。
今回の環境だと(0 行)と返ってきた。
文字エンコーディングの違いでwhere句以下の値が文字化けするのが原因だと思う。
コマンド自体は読み込まれてしまいエラーにならないので不具合に気づきにくい。注意が必要。

先ほどつくったselect_where.sqlの文字エンコーディングUTF-8PowerShellの文字エンコーディングSJIS
テキストエディタ側でselect_where.sqlの文字エンコーディングをShift-JISにすると正しく認識された。

PostgreSQLPowerShell、外部ファイルの文字エンコーディングの違いに注意が必要。
必要に応じて前回使った\encodingコマンドを使う。
今回の場合、ファイル読み込みではなく、PowerShellからselectコマンドを入力すれば設定変更せずに問題なく実行される。


where句を使ってボートレース(レガッタ)結果から必要な情報だけを抜き取れた。
次回からPostgreSQLRubyで操作していきます。


今回の動作確認環境
macOS 10.13.3
ターミナル 2.8.2
Windows10 1709
Windows PowerShell 5.1.16299.251
PostgreSQL 10.3