2014/07/23
PostgreSQL > pgAdmin のクエリツールを電卓代わりに
PostgreSQL > pgAdmin のクエリツールを電卓代わりに
特にデータベースを操作しなくとも、とりあえず ↓ のようにクエリツールを小さく起動して select だけ書いておくことが多い。ちょっとした計算が必要になった時、select の後に式を書いて実行すれば電卓代わりに使える。
関数電卓には及ばないが、基本的な算術関数・演算子は PostgreSQL に揃っている。詳細は下記ドキュメントを、この記事の実行環境は 2014/04/17 を参照。
■ PostgreSQL 9.3.2文書 : 算術関数と演算子
http://www.postgresql.jp/document/9.3/html/functions-math.html
以下、↓ のマニュアルにあった計算例を実際にクエリツールで実行した例。簡便さ重視のため SQL の英字をすべて小文字で書いた。
■ Ex.1
↑ UNION ALL で複数の計算結果を簡単に縦に並べられる。三角関数の引数はラジアンを取るので、度は radians を経由する。min, max など集約関数を使う場合、数値を VALUES 句で書いてもいいが、上のように FROM unnest(ARRAY[……]) の配列に入れてもいい。
■ Ex.2
↑ ネイピア数は exp(1)。累乗に負数を使う場合 ^(-■) と括弧でくくる。でないと ^- という存在しない演算子を指定されたと解釈され、エラーになる。
■ Ex.3
↑ π は pi()。累乗根は分数指数に置き換える。指数に限らず PostgreSQL で分数を入力する際の注意点として、分子分母ともに整数の時は分母を float など実数にキャストする。でないと整数どうしの除算と見なされ、小数点以下を切り捨てた商が使われる。
■ Ex.4
↑ これは単純な例。
■ Ex.5
↑ 剰余は %。ただし負数を含む場合の結果が関数電卓と異なる。そもそもプログラミング言語の間でも結果が異なる問題。詳細は下記が詳しい。
■ おともだちティータイム : 負数の剰余を計算してはならない
http://shunirr.hatenablog.jp/entry/20120409/1333993409
■ Ex.6
↑ 75乗、-79乗はエラーになるかと思ったが実行できた。ただし一番目だけ実行すると、下のようにゼロがたくさん並び先頭の数値が隠れる結果に。
↓ 列幅を広げたところ。-2.5 という小数表記が numeric 型として扱われ、コンピュータ内部で小さな端数が出るので下位にゼロがたくさん並ぶ。先ほどは UNION ALL で float 型の結果が結合されたので float に丸められこの端数が消えた。
以上、PostgreSQL 独特の注意点やコンピュータ全般に共通の精度・丸め等の問題があるが、簡易な電卓代わりにはなる。また PostgreSQL で計算する際の注意点に気付いたり思い出したりするのも、自分にとってはプラス。そしてたくさんの計算をコピペしたり、 ↓ のようにコメント付きで整理でき、直接テキストファイルに保存できる。
↓ クエリを読み込むのと同様に、保存した計算式を呼び出せる。
関数電卓には及ばないが、基本的な算術関数・演算子は PostgreSQL に揃っている。詳細は下記ドキュメントを、この記事の実行環境は 2014/04/17 を参照。
■ PostgreSQL 9.3.2文書 : 算術関数と演算子
http://www.postgresql.jp/document/9.3/html/functions-math.html
以下、↓ のマニュアルにあった計算例を実際にクエリツールで実行した例。簡便さ重視のため SQL の英字をすべて小文字で書いた。
■ Ex.1
select max(unnest)
from unnest(array[3, sin(radians(30)), cos(radians(30))])
union all
select min(unnest)
from unnest(array[3, sin(radians(30)), cos(radians(30))]) ;
↑ UNION ALL で複数の計算結果を簡単に縦に並べられる。三角関数の引数はラジアンを取るので、度は radians を経由する。min, max など集約関数を使う場合、数値を VALUES 句で書いてもいいが、上のように FROM unnest(ARRAY[……]) の配列に入れてもいい。
■ Ex.2
select exp(1)^(-3) + 10^1.2 + ln(3)
union all
select log(3, 81) - log(1) ;
↑ ネイピア数は exp(1)。累乗に負数を使う場合 ^(-■) と括弧でくくる。でないと ^- という存在しない演算子を指定されたと解釈され、エラーになる。
■ Ex.3
select
((2^2 + 5^3)^(1/3 :: float))^(-1) * pi()
union all
select
(2^6)^(1/3 :: float) + 243^(1/5 :: float) ;
↑ π は pi()。累乗根は分数指数に置き換える。指数に限らず PostgreSQL で分数を入力する際の注意点として、分子分母ともに整数の時は分母を float など実数にキャストする。でないと整数どうしの除算と見なされ、小数点以下を切り捨てた商が使われる。
■ Ex.4
select
tan(radians(30))
union all
select
pi() / 8 ;
↑ これは単純な例。
■ Ex.5
select
23 % 5
union all
select
-23 % 5 ;
↑ 剰余は %。ただし負数を含む場合の結果が関数電卓と異なる。そもそもプログラミング言語の間でも結果が異なる問題。詳細は下記が詳しい。
■ おともだちティータイム : 負数の剰余を計算してはならない
http://shunirr.hatenablog.jp/entry/20120409/1333993409
■ Ex.6
select
-2.5^2
union all
select
4 * 10^75 * -2 * 10^(-79) ;
↑ 75乗、-79乗はエラーになるかと思ったが実行できた。ただし一番目だけ実行すると、下のようにゼロがたくさん並び先頭の数値が隠れる結果に。
↓ 列幅を広げたところ。-2.5 という小数表記が numeric 型として扱われ、コンピュータ内部で小さな端数が出るので下位にゼロがたくさん並ぶ。先ほどは UNION ALL で float 型の結果が結合されたので float に丸められこの端数が消えた。
以上、PostgreSQL 独特の注意点やコンピュータ全般に共通の精度・丸め等の問題があるが、簡易な電卓代わりにはなる。また PostgreSQL で計算する際の注意点に気付いたり思い出したりするのも、自分にとってはプラス。そしてたくさんの計算をコピペしたり、 ↓ のようにコメント付きで整理でき、直接テキストファイルに保存できる。
↓ クエリを読み込むのと同様に、保存した計算式を呼び出せる。