FrontPage


Firbird SQL リファレンス:演算子と標準UDF(ユーザー定義関数)



演算子

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

文字列演算子

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

算術演算子

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

論理演算子

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

比較演算子

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

その他の演算子

演算子演算内容互換補足・備考
※この表での順序は、おおむねアルファベット順となっており優先度は反映されていません。
ALLクエリ結果セットの値のすべてが条件を満たすならば真例 : WHERE item1 = ALL (SELECT item1 FROM table1)
ANYクエリ結果セットの値のいずれかが条件を満たすならば真例 : WHERE item1 = ANY (SELECT item1 FROM table1)
SOMEANYの別名
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'


標準UDF

 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の一覧表

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

|tan(a1)|DOUBLE PRECISION|a1=DOUBLE PRECISION タンジェントを求める

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