PostgreSQLのpsqlコマンドで実行したSQLの結果を縦表示する様々な方法を解説します。psqlコマンド内で実行した結果を縦表示にする方法、Linuxコマンドラインでpsqlコマンドから直接SQLを実行する際に結果を縦表示にする方法を解説します。方法はいくつかありますが、シェルスクリプトで結果を縦表示させたいという場合に非常に重宝します。
結果の縦表示で探しても、あまり多くの方法が網羅された情報がありませんでしたので、実際に自分のデータベース環境で試した一通りの方法をまとめています。
psqlコマンド内で実行した結果を縦表示にする
psqlコマンド内で実行するSQLの結果を縦表示にするにはいくつか方法がありますので、1つずつ解説していきます。
「\x」コマンドで結果を縦表示と横表示に切り替える
psqlコマンドでSQLを実行すると、通常は以下のように列が横に表示されてしまいます。
=# SELECT * FROM hoge;
\+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | aaa | 16 |
| 2 | bbb | 32 |
| 3 | ccc | 75 |
+----+------+-----+
(3 rows)
結果を縦表示にするには次のように「\x」コマンドを実行します。すると縦表示に変更されて結果が表示されます。
=# \x
Expanded display is on.
=# SELECT * FROM hoge;
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
そして元に戻すには再度「\x」コマンドを実行します。これによって元の横表示に戻ります。
=# \x
Expanded display is off.
=# SELECT * FROM hoge;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | aaa | 16 |
| 2 | bbb | 32 |
| 3 | ccc | 75 |
+----+------+-----+
(3 rows)
「\pset x on」と「\pset x off」で縦表示と横表示に切り替える
psqlコマンド内で「\pset x on」というコマンドを実行することで縦表示にすることも可能です。そして「\pset x off」で縦表示を解除して横表示に戻すことが出来ます。
=# \pset x on
Expanded display is on.
=# SELECT * FROM hoge;
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
=# \pset x off
Expanded display is off.
=# SELECT * FROM hoge;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | aaa | 16 |
| 2 | bbb | 32 |
| 3 | ccc | 75 |
+----+------+-----+
(3 rows)
「\pset x on」コマンドは、「\pset x」だけを入力しても設定可能です。もう一度「\pset x」を実行すると元に戻すことが出来ます。
=# \pset x
Expanded display is on.
=# SELECT * FROM hoge;
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
=# \pset x
Expanded display is off.
=# SELECT * FROM hoge;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | aaa | 16 |
| 2 | bbb | 32 |
| 3 | ccc | 75 |
+----+------+-----+
(3 rows)
「\pset expanded」で縦表示と横表示に切り替える
「\pset expanded」コマンドを実行することで縦表示にすることが可能です。再度実行すれば横表示に戻ります。
=# \pset expanded
Expanded display is on.
=# SELECT * FROM hoge;
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
=# \pset expanded
Expanded display is off.
=# SELECT * FROM hoge;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | aaa | 16 |
| 2 | bbb | 32 |
| 3 | ccc | 75 |
+----+------+-----+
(3 rows)
「\x auto」で結果に応じて縦表示と横表示を自動的に切り替える
psqlコマンド内で「\x auto」コマンドを使うと、列の長さに応じて自動的に横表示と縦表示を切り替えてくれる便利な機能があります。例えば以下の例のtestテーブルはidとname列に短い文字列しか設定されていませんので、通常の横表示になっています。一方、hogeテーブルのように列数が非常に多いテーブルで画面右端を超えてしまうような長さのテーブルをSELECTした場合には、自動的に縦表示が選択されています。自動的に縦横表示を切り替えてくれるのは便利です。
=# \x auto
Expanded display is used automatically.
=# SELECT * FROM test;
+----+------------+
| id | name |
+----+------------+
| 1 | postgresql |
| 2 | mysql |
| 3 | mssql |
| 4 | oracle |
+----+------------+
(4 rows)
=# SELECT * FROM hoge;
+-[ RECORD 1 ]----------------+
| id | 1 |
| name | record-a |
| aaa | aaaaaaaaaa1234567890 |
| bbb | bbbbbbbbbb1234567890 |
| ccc | cccccccccc1234567890 |
| ddd | dddddddddd1234567890 |
| eee | eeeeeeeeee1234567890 |
| fff | ffffffffff1234567890 |
| ggg | gggggggggg1234567890 |
| hhh | hhhhhhhhhh1234567890 |
| iii | iiiiiiiiii1234567890 |
| jjj | jjjjjjjjjj1234567890 |
| kkk | kkkkkkkkkk1234567890 |
| lll | llllllllll1234567890 |
| mmm | mmmmmmmmmm1234567890 |
| nnn | nnnnnnnnnn1234567890 |
| ooo | oooooooooo1234567890 |
+-[ RECORD 2 ]----------------+
| id | 2 |
| name | record-b |
| aaa | xxxxxxxxxx1234567890 |
| bbb | yyyyyyyyyy1234567890 |
| ccc | zzzzzzzzzz1234567890 |
| ddd | dddddddddd1234567890 |
| eee | eeeeeeeeee1234567890 |
| fff | ffffffffff1234567890 |
| ggg | gggggggggg1234567890 |
| hhh | hhhhhhhhhh1234567890 |
| iii | iiiiiiiiii1234567890 |
| jjj | jjjjjjjjjj1234567890 |
| kkk | kkkkkkkkkk1234567890 |
| lll | llllllllll1234567890 |
| mmm | mmmmmmmmmm1234567890 |
| nnn | nnnnnnnnnn1234567890 |
| ooo | oooooooooo1234567890 |
+------+----------------------+
1行でSQLの結果を縦表示・横表示に切り替える方法
しかし縦表示に変更して・・・横表示に戻して・・・というのを繰り返すのは大変ですので、次のようにSQL分の最後に「\x\g\x」というコマンドを入力することによって縦表示に切り替えてSQLを実行し、再度元に戻すというのを1行で実行することが出来ます。
=# SELECT * FROM hoge \x\g\x
Expanded display is on.
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
Expanded display is off.
なお「\x\g\x」の「\g」はSQL文を実行するというコマンドで、SQL文の末尾にセミコロン「;」を付けなくても、SQL文の最後に「\g」というコマンドを入れればSQLを実行することが出来ます。
Linuxコマンドライン上のpsqlで結果を縦表示する
ではLinuxコマンドラインで、psqlを実行する時に縦表示にするにはどうすればよいでしょうか。それには「-c」オプションを2つ付けて、最初に「\x」コマンドを実行し、その後の「-c」オプションでSQLコマンドを実行することによって、結果を縦表示にすることが出来ます。
$ psql -c '\x' -c 'SELECT * FROM hoge;'
Expanded display is on.
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
また次のように「-xc」というオプションを付けても縦表示にできます。同じように「-x」というオプションを単独で付けても縦表示にすることが出来ます。
$ psql -xc 'SELECT * FROM hoge;'
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
$ psql -x -c 'SELECT * FROM hoge;'
+-[ RECORD 1 ]-+
| id | 1 |
| name | aaa |
| age | 16 |
+-[ RECORD 2 ]-+
| id | 2 |
| name | bbb |
| age | 32 |
+-[ RECORD 3 ]-+
| id | 3 |
| name | ccc |
| age | 75 |
+------+-----+
まとめ
SQL実行結果が横長で画面をはみ出してしまう場合や、画面右端で折り返されたりすると結果を確認しにくいものです。ここで紹介した様々な結果の縦表示方法を使って、psqlコマンドライン内での結果を縦表示にしたり、Linuxコマンドラインでpsql実行した場合の結果を縦表示にして効率を上げてみましょう。