PostgreSQLの関数 書き方
はじめに
CodewarsというサイトでSQLの問題にチャレンジしている際に書けてしまったので、
発見は記録しておこうということでこちらに書いていこうかなということで記事にしました。
こんなコード書いたんです
DROP FUNCTION IF EXISTS weekdays(DATE,DATE);
CREATE OR REPLACE FUNCTION weekdays(DATE,DATE)
RETURNS INTEGER AS $$
  select $1 - $2
$$
LANGUAGE sql;
問題の内容
Codewarsで出題された問題なんですが、以下のような感じでした。
※この記事書いてる時点では解けていないです笑
二つの日付(DATE型)を引数として与えられた関数が
その二つの引数間の営業日ベース(土日除く)で日数をカウントして、
INTEGERのデータ型がカウントした日数を出力せい 
実行結果と分析
まず、実行した結果からお伝えします。
| weekdays |
|   --:    |
|   -9     |
まぁ、これがお作法なのかは全く分からないまま書き連ねているのですが…
とりあえず、最初の一文「DROP FUNCTION IF EXISTS weekdays(DATE,DATE);」で関数自体の初期化をしています。
DROP FUNCTION なので、処理としては「読んで字の如く」ですね。
最初に関数の定義自体を捨てています。このことを私が勝手に初期化とかかっこつけて呼んでます。
これを行う理由としては引数を変えた時にPostgreSQLが引数の情報を更新できないことがあるからだそうです。
※以下の方の記事を参考にさせていただきました。ありがとうございます。
【PostgreSQLで関数を作って、使う[PL/pgSQL入門]】
< https://qiita.com/SRsawaguchi/items/411801e254ee66f511f1 >
初期化をした後に以下のような形式で関数の定義を行なっています。
CREATE OR REPLACE FUNCTION weekdays(DATE,DATE)
RETURNS INTEGER AS
上記は関数名:weekdaysという名前でかつ、その関数に与えられる引数はDATE型のデータ2つであることが定義さしています。
見方なのですが、
  「CREATE OR REPLACE FUNCTION」は「関数を作るよ」の宣言部分
  「関数名(引数1,引数2)」
と私は解釈しています。
そして、RETURNSには関数の戻り値が格納されます。
RETURNSの後に記載するのは戻り値のデータ型です。
つまり、この関数はDATE型2つを引数にとり、戻り値はINTEGER型で返すということです。
RETURNS INTEGER AS $$
  select $1 - $2
$$
LANGUAGE sql;
実際の処理部分は
$$〜$$
で囲った箇所になります。
つまり、この関数で言うと「select $1 - $2」の部分が実行部分になります。
LANGUAGEは何の言語を使用するかを指定する部分です。
↑の関数の場合はSQLを使用するということを示しています。
ちなみに現在、使用可能な言語は以下、公式サイトに記載されています。
【PostgreSQL 9.6.5文書 CREATE FUNCTION】
< https://www.postgresql.jp/document/9.6/html/sql-createfunction.html >
lang_name
関数を実装している言語の名前です。 
このパラメータには、sql、c、internal、もしくはユーザ定義手続き言語(例:plpgsql)の名前を指定可能です。
名前を単一引用符で囲むのは廃止予定で、大文字小文字の一致が必要になります。
ということでsql,c,internal(?),ユーザが定義した言語(★)を指定することが可能とのことです。
※執筆時点(2018年7月時点)の最新バージョン9.6ではそのように定義されています。
★PostgreSQLではユーザが定義した言語とはストアドプロシージャを示すそうです。
 以下のサイトに情報が上がっていました。
 【ユーザー定義関数を使う】
  < http://www50.tok2.com/home/oppama/pgfuncdef.html >
問題が解けたら随時更新していきます!