[[FrontPage]]へ~
-[[リファレンスガイド]]へ~
--[[Firebird SQLリファレンス]]へ~
&br;
----
*Firbird SQL リファレンス:演算子と標準UDF(ユーザー定義関数) [#l23c7544]

#contents

----
&br;
&aname(operator);
*演算子 [#c6ac5f28]

 Firebird で使用できる演算子の一覧です。基本的に、表中で上になるほど 優先順位が高くなっています。また、括弧'()'でくくることにより、式中での 評価順序を変更することも出来ます。&br;
 表の互換欄の○は、SQL-92またはSQL-99準拠であることを示しています。

**文字列演算子 [#ffb11c69]

|演算子|演算内容|互換|補足・備考|h
||||2つの文字列を連結します|○|例 'abcdefg'||'hijklmn'&br;(|はWikiの都合上全角文字になっていますが、本当は半角文字です。)|

**算術演算子 [#d26dd904]

|演算子|演算内容|互換|補足・備考|h
|*|乗算|○|例 : 12.45 * 66.98|
|/|除算|○|例 : 18 / 4|
|+|加算|○|例 : 111 + 222|
|-|減算|○|例 : 333 - 111|

**論理演算子 [#z9f57f21]

|演算子|演算内容|互換|補足・備考|h
|NOT|否定|○|WHERE節での例 : WHERE NOT item1 = 2|
|AND|論理積|○|WHERE節での例 : WHERE item1 != 3 AND item2 = 4|
|OR|論理和|○|WHERE節での例 : WHERE item1 = 3 OR item2 = 0|

**比較演算子 [#jc467164]

|演算子|演算内容|互換|補足・備考|h
|=|等しければ真|○|例 : item3 = 'BOOK'|
|==|~|×|~|
|<>,!=,~=,^=|等しくなければ真|○|例 : item1 <> 3|
|> |より大ききければ真|○|例 : item2 > 3|
|<|より小さければ真|○|例 : item2 < 3|
|>=|より大きいか等しければ真|○|例 : item2 >= 4|
|<=|より小さいか等しければ真|○|例 : item2 <= 2|
|!>,~>,^>|より大きくなければ真|×|例 : item2 !> 4|
|!<,~<,^<|より小さくなければ真|×|例 : item2 !< 2|

**その他の演算子 [#oe02da1e]

|演算子|演算内容|互換|補足・備考|h
|ALL|クエリ結果セットの値のすべてが条件を満たすならば真|○|例 : WHERE item1 = ALL (SELECT item1 FROM table1)|
|ANY|クエリ結果セットの値のいずれかが条件を満たすならば真|○|例 : WHERE item1 = ANY (SELECT item1 FROM table1)|
|SOME|ANYの別名|~|~|
|BETWEEN|範囲内にあれば真|○|例 : WHERE item2 BETWEEN 0 AND 999|
|CONTAINING|指定した文字列が含まれれば真|×|例 : WHERE item3 CONTAINING 'BOOK'|
|EXISTS|クエリ結果セットに取得された行が存在すれば真|○|例 : WHERE EXIST (SELECT item1 FROM table1 WHERE item1 != 3)|
|IN|指定したグループに含まれていれば真|○|例 : WHERE item3 IN ('BOOK','NOTE')|
|IS NULL|値がNULLなら真|○|例 : WHERE item3 IS NULL|
|LIKE|文字列パターンに合致すれば真|○|例 : WHERE item3 LIKE 'B%'|
|SINGULAR|クエリ結果セットの取得された行が1つなら真|×|例 : WHERE SINGULAR (SELECT item1 FROM table1 WHERE item1 != 3)|
|STARTING WITH|指定した文字列で始まるなら真|×|例 : WHERE item3 STARTTING WITH 'B'|
|>|>|>|※この表での順序は、おおむねアルファベット順となっており優先度は反映されていません。|f

&br;
&aname(udf);
*標準UDF [#od621801]
 Firebirdに標準で用意されたUDF(ユーザー定義関数)です。UDFはデータベースを 作成した直後の状態では使用できません。使用前に、DECLARE EXTERNAL FUNCTION により、必要な関数・モジュール(DLL, .soなど)をロードする必要があります。~
 ロードについては、(Firebird1.5以降では)標準UDFを一括して簡単に読込むための SQLファイルが用意されています。通常の格納場所は、Firebirdをインストールした ディレクトリ下の UDF ディレクトリですが、設定ファイルによって変更されている 場合もあります。~
 SQLのファイルは2つあって、ib_udf.sql (InterBase6由来のUDF用)とfbudf.sql (Firebirdで追加されたUDF)となっています。これらのファイルを、isql などの SQL 発行ツールで読込み、クエリを実行することにより以降で標準UDFが使用できる ようになります。~
 例えばisql(対話モード)の場合、データベースの接続を行った後に、inputコマンド を実行してファイルからSQLを読込んで実行します。例えば、次に示すような2つの コマンドを打ち込みます。(パスの指定は当然ながら環境に依存します。)

 input c:\progra~1\firebird\firebird_1_5\udf\ib_udf.sql;
 input c:\progra~1\firebird\firebird_1_5\udf\fbudf.sql;

当然ながら、DECLARE EXTERNAL FUNCTION で1関数ずつ読込むことも可能です。

 isql 等で簡単に動作確認を行う場合、システムテーブルとして用意されている rdb$database を FROM に指定することにより、簡単に関数の動作を確認できます。 例えば bin_and 関数の動作を確認するには、次のようなSQLを発行します。ちなみに 、関数名は大文字小文字のどちらでも構いません。

 SELECT BIN_AND(2,3) FROM RDB$DATABASE;

**UDFの一覧表 [#a0760e76]
-InterBase由来のUDF(1.5.1)~
モジュール名 : ib_udf.dll(Windows), ib_udf.so(Linux)

|関数|戻り値|引数|説明|h
|abs(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|絶対値を求める|
|acos(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|アークコサインを求める|
|ascii_char(a1)|文字列(1文字)|a1=INTEGER|1つの文字コードを文字列に変換|
|ascii_val(a1)|INTEGER|a1=文字列(1文字)|1つの文字の文字コードを取得。複数文字やマルチバイト文字は取り扱えない|
|asin(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|アークサインを求める|
|atan(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|アークタンジェントを求める|
|atan2(a1,a2)|DOUBLE PRECISION|a1,a2=DOUBLE PRECISION|2辺を指定してアークタンジェントを求める|
|bin_and(a1,a2)|INTEGER|a1,a2=INTEGER|2値のビット単位での論理積を求める|
|bin_or(a1,a2)|INTEGER|a1,a2=INTEGER|2値のビット単位での論理和を求める|
|bin_xor(a1,a2)|INTEGER|a1,a2=INTEGER|2値のビット単位での排他的論理和を求める|
|ceiling(a1)|INTEGER|a1=DOUBLE PRECISION|小数点以下切り上げを行う。戻り値は整数ではないので注意|
|cos(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|コサインを求める|
|cosh(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|ハイパボリックコサインを求める|
|cot(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|コタンジェントを求める|
|div(a1,a2)|DOUBLE PRECISION|a1,a2=DOUBLE PRECISION|除算を行う|
|floor(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|小数点以下切捨てを行う。戻り値は整数ではないので注意|
|ln(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|自然対数の計算を行う|
|log(a1,a2)|DOUBLE PRECISION|a1,a2=DOUBLE PRECISION|基底a1のa2の対数を計算する|
|log10(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|基底10の対数(常用対数)の計算を行う|
|lower(a1)|文字列|a1=文字列|入力文字列中のすべてのアルファベットを小文字に変換する&br;※Firebirdの制限により、最大で32767バイト以上の文字列は処理できない&br;※キャラクタセットは無視され、すべてアスキー文字として処理される|
|lpad(a1,a2,a3)|文字列|a1=文字列, a2=INTEGER, a3=文字列(1文字)|文字列a1をa2で指定した文字数に変換する&br;・a1の長さ<a2の場合、左側をa3の文字でパディング&br;・a1の長さ>=a2の場合は指定した長さに先頭から切り取る&br;※Firebirdの制限により、最大で32767バイト以上の文字列は処理できない|
|ltrim(a1)|文字列|a1=文字列|左側の空白文字を取り除く|
|mod(a1,a2)|DOUBLE PRECISION|a1,a2=INTEGER|a1をa2で割ったときの余りを求める|
|pi()|DOUBLE PRECISION|なし|円周率πを返す|
|rand()|DOUBLE PRECISION|なし|0〜1の範囲の乱数を返す|
|rpad(a1,a2,a3)文字列|文字列|a1=文字列, a2=INTEGER, a3=文字列(1文字)|右側にパディングが行われる以外、lpadと同じ|
|rtrim(a1)|文字列|a1=文字列|右側の空白文字を取り除く|
|sign(a1)|INTEGER|a1=DOUBLE PRECISION|符号判定を行う。負なら-1、ゼロなら0、正なら1を返す|
|sin(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|サインを求める|
|sinh(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|ハイパボリックサインを求める|
|sqrt(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|平方根を求める|
|substr(a1,a2,a3)|文字列|a1=文字列, a2,a3=SMALLINT|文字列a1のa2文字目からa3文字目を抜き出した文字列を返す&br;※Firebirdでは組込み関数SUBSTRINGが実装されたので、使用を推奨しない|
|substrlen(a1,a2,a3)|文字列|a1=文字列, a2,a3=SMALLINT|文字列a1のa2文字目からa3文字を抜き出した文字列を返す&br;※Firebirdでは組込み関数SUBSTRINGが実装されたので、使用を推奨しない|
|strlen(a1)|INTEGER|a1=文字列|文字列の長さを求める|
|tan(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION	タンジェントを求める
|tanh(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION|ハイパボリックタンジェントを求める|

-Firebirdで追加されたUDF(1.5.1)~
 モジュール名 : fbudf.dll(Windows), fbudf.so(Linux)~
 こちらは、ib_udfに依存してるものも多いです。

|関数|戻り値|引数|説明|h
|addday(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2日足したものを返す|
|addmonth(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2月足したものを返す|
|addweek(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2週足したものを返す|
|addyear(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2年足したものを返す|
|addmillisecond(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2ミリ秒足したものを返す|
|addminute(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2分足したものを返す|
|addsecond(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2秒足したものを返す|
|addhour(a1,a2)|TIMESTAMP|a1=TIMESTAMP, a2=INTEGER|日時a1にa2時間足したものを返す|
|dow(a1)|文字列|a1=TIMESTAMP|曜日を求める|
|dpower(a1,a2)|DOUBLE PRECISIO|	a1,a2=DOUBLE PRECISION|累乗計算を行う。a1をa2乗した数を求める|
|getexacttimestamp()|TIMESTAMP|なし|現在時刻をミリ秒まで含めた高精度の値で返す。1.5.1現在、組込み関数のCURRENT_TIMEやCURRENT_TIMESTAMPでは秒精度の時間が取得される。また、現状ではWin32環境以外には存在しない可能性が高い。|
|sdow(a1)|文字列|a1=TIMESTAMP|曜日を求める。結果は短縮形になる|
|sright(a1,a2)|文字列|a1=文字列, a2=SMALLINT|a1の右側a2文字を抜き出した文字列を返す|
|string2blob(a1)|BLOB|a1=文字列|文字列をBLOBに変換する|
--以下の関数は、ib_udfを呼び出しているだけなので使用する意味があまりない
---CEILINGと同じ(小数点以下切り上げ)~
Truncate,i64Truncate
---FLOORと同じ(小数点以下切り捨て)~
Round,i64Round
--以下の関数は、旧バージョンとの後方互換のために用意されている物なので使用 する必要はない。CASE、COALESCE、NULLIFを使用すること。
---invl
---i64nv
---dnvl
---snvl
---inullif
---dnullif
---i64nullif
---snullif