エスケープされたスカラ関数

JDBC仕様では、エスケープ付きの呼び出し構文{fn function_name(arguments)}を定義しています。 以下の表は、どの関数がPostgresSQL™ドライバでサポートされているかを示します。 エスケープされた関数やエスケープされた値を入れ子にすることや混在させることを、ドライバはサポートしています。 JDBC仕様付録Cでは、関数について説明しています。

以下の表の関数の一部は変換されますが、引数が二重化されたり、引数の順序が変更されたりするためにサポート済みとして報告されないものがあります。 これはリテラル値や列では影響ありませんが、準備済み文を使用する場合には問題になります。 例えば、"{fn right(?,?)}"は"substring(? from (length(?)+1-?))"に変換されます。 変換後のSQLを見てわかるように、変換前よりも多くのパラメータが必要になりますが、ドライバはこれを自動的に扱ってくれません。

表 8.1. サポート済みのエスケープされた数値関数

関数サポート済みとして報告されているか変換内容注釈
abs(arg1)yesabs(arg1) 
acos(arg1)yesacos(arg1) 
asin(arg1)yesasin(arg1) 
atan(arg1)yesatan(arg1) 
atan2(arg1,arg2)yesatan2(arg1,arg2) 
ceiling(arg1)yesceil(arg1) 
cos(arg1)yescos(arg1) 
cot(arg1)yescot(arg1) 
degrees(arg1)yesdegrees(arg1) 
exp(arg1)yesexp(arg1) 
floor(arg1)yesfloor(arg1) 
log(arg1)yesln(arg1) 
log10(arg1)yeslog(arg1) 
mod(arg1,arg2)yesmod(arg1,arg2) 
pi(arg1)yespi(arg1) 
power(arg1,arg2)yespow(arg1,arg2) 
radians(arg1)yesradians(arg1) 
rand()yesrandom() 
rand(arg1)yessetseed(arg1)*0+random()シードは指定された引数で初期化され、新しいランダム値が返されます。
round(arg1,arg2)yesround(arg1,arg2) 
sign(arg1)yessign(arg1) 
sin(arg1)yessin(arg1) 
sqrt(arg1)yessqrt(arg1) 
tan(arg1)yestan(arg1) 
truncate(arg1,arg2)yestrunc(arg1,arg2) 

表 8.2. サポート済みのエスケープされた文字列関数

関数サポート済みとして報告されているか変換内容注釈
ascii(arg1)yesascii(arg1) 
char(arg1)yeschr(arg1) 
concat(arg1,arg2...)yes(arg1||arg2...)JDBC仕様では、2つの引数を取るバージョンのみが規定されています。しかし、より多くの引数をサポートする方がより簡単でした。。。
insert(arg1,arg2,arg3,arg4)nooverlay(arg1 placing arg4 from arg2 for arg3)この関数はサポート済みとして報告されません。引数の順序が変更され、(例えば準備済み文で)問題になる可能性があるためです。
lcase(arg1)yeslower(arg1) 
left(arg1,arg2)yessubstring(arg1 for arg2) 
length(arg1)yeslength(trim(trailing from arg1)) 
locate(arg1,arg2)noposition(arg1 in arg2) 
locate(arg1,arg2,arg3)no(arg2*sign(position(arg1 in substring(arg2 from arg3)+position(arg1 in substring(arg2 from arg3))サポート済みとして報告されません。この3つの引数を取るバージョンでは、引数が二重化され、その順序も変更されるためです。
ltrim(arg1)yestrim(leading from arg1) 
repeat(arg1,arg2)yesrepeat(arg1,arg2) 
replace(arg1,arg2,arg3)yesreplace(arg1,arg2,arg3)7.3以上のサーバでのみサポート済みと報告されます。
right(arg1,arg2)nosubstring(arg1 from (length(arg1)+1-arg2))arg1が二重化されるため、サポート済みとして報告されません。
rtrim(arg1)yestrim(trailing from arg1) 
space(arg1)yesrepeat(' ',arg1) 
substring(arg1,arg2)yessubstr(arg1,arg2) 
substring(arg1,arg2,arg3)yessubstr(arg1,arg2,arg3) 
ucase(arg1)yesupper(arg1) 
soundex(arg1)nosoundex(arg1)fuzzystrmatch contribモジュールが必要であるため、サポート済みとして報告されません。
difference(arg1,arg2)nodifference(arg1,arg2)fuzzystrmatch contribモジュールが必要であるため、サポート済みとして報告されません。

表 8.3. サポート済みのエスケープされた日付/時刻関数

関数サポート済みとして報告されているか変換内容注釈
curdate()yescurrent_date 
curtime()yescurrent_time 
dayname(arg1)yesto_char(arg1,'Day') 
dayofmonth(arg1)yesextract(day from arg1) 
dayofweek(arg1)yesextract(dow from arg1)+1想定する1-7までの範囲にするために1を足さなければなりません。
dayofyear(arg1)yesextract(doy from arg1) 
hour(arg1)yesextract(hour from arg1) 
minute(arg1)yesextract(minute from arg1) 
month(arg1)yesextract(month from arg1) 
monthname(arg1)yesto_char(arg1,'Month') 
now()yesnow() 
quarter(arg1)yesextract(quarter from arg1) 
second(arg1)yesextract(second from arg1) 
week(arg1)yesextract(week from arg1) 
year(arg1)yesextract(year from arg1) 
timestampadd(argIntervalType,argCount,argTimeStamp)yes('(argIntervalTypeとargCountに従った時間間隔)'+argTimeStamp)バックエンドでサポートしていませんので、SQL_TSI_FRAC_SECONDのargIntervalType値は実装されていません。
timestampdiff(argIntervalType,argTimeStamp1,argTimeStamp2)notargTimeStamp2-argTimeStamp1を元にしたextract((argIntervalTypeに従う時間間隔) from argTimeStamp2-argTimeStamp1 )SQL_TSI_FRAC_SECONDSQL_TSI_FRAC_MINUTESQL_TSI_FRAC_HOURSQL_TSI_FRAC_DAYのargIntervalType値のみがサポートされます

表 8.4. サポート済みのエスケープされたその他の関数

関数サポート済みとして報告されているか変換内容注釈
database()yescurrent_database()7.3以上のサーバでのみサポート済みと報告されます。
ifnull(arg1,arg2)yescoalesce(arg1,arg2) 
user()yesuser