JDBC仕様では、エスケープ付きの呼び出し構文{fn function_name(arguments)}を定義しています。
以下の表は、どの関数がPostgresSQL™ドライバでサポートされているかを示します。
エスケープされた関数やエスケープされた値を入れ子にすることや混在させることを、ドライバはサポートしています。
JDBC仕様付録Cでは、関数について説明しています。
以下の表の関数の一部は変換されますが、引数が二重化されたり、引数の順序が変更されたりするためにサポート済みとして報告されないものがあります。
これはリテラル値や列では影響ありませんが、準備済み文を使用する場合には問題になります。
例えば、"{fn right(?,?)}"は"substring(? from (length(?)+1-?))"に変換されます。
変換後のSQLを見てわかるように、変換前よりも多くのパラメータが必要になりますが、ドライバはこれを自動的に扱ってくれません。
表 8.1. サポート済みのエスケープされた数値関数
| 関数 | サポート済みとして報告されているか | 変換内容 | 注釈 |
|---|
| abs(arg1) | yes | abs(arg1) | |
| acos(arg1) | yes | acos(arg1) | |
| asin(arg1) | yes | asin(arg1) | |
| atan(arg1) | yes | atan(arg1) | |
| atan2(arg1,arg2) | yes | atan2(arg1,arg2) | |
| ceiling(arg1) | yes | ceil(arg1) | |
| cos(arg1) | yes | cos(arg1) | |
| cot(arg1) | yes | cot(arg1) | |
| degrees(arg1) | yes | degrees(arg1) | |
| exp(arg1) | yes | exp(arg1) | |
| floor(arg1) | yes | floor(arg1) | |
| log(arg1) | yes | ln(arg1) | |
| log10(arg1) | yes | log(arg1) | |
| mod(arg1,arg2) | yes | mod(arg1,arg2) | |
| pi(arg1) | yes | pi(arg1) | |
| power(arg1,arg2) | yes | pow(arg1,arg2) | |
| radians(arg1) | yes | radians(arg1) | |
| rand() | yes | random() | |
| rand(arg1) | yes | setseed(arg1)*0+random() | シードは指定された引数で初期化され、新しいランダム値が返されます。 |
| round(arg1,arg2) | yes | round(arg1,arg2) | |
| sign(arg1) | yes | sign(arg1) | |
| sin(arg1) | yes | sin(arg1) | |
| sqrt(arg1) | yes | sqrt(arg1) | |
| tan(arg1) | yes | tan(arg1) | |
| truncate(arg1,arg2) | yes | trunc(arg1,arg2) | |
表 8.2. サポート済みのエスケープされた文字列関数
| 関数 | サポート済みとして報告されているか | 変換内容 | 注釈 |
|---|
| ascii(arg1) | yes | ascii(arg1) | |
| char(arg1) | yes | chr(arg1) | |
| concat(arg1,arg2...) | yes | (arg1||arg2...) | JDBC仕様では、2つの引数を取るバージョンのみが規定されています。しかし、より多くの引数をサポートする方がより簡単でした。。。 |
| insert(arg1,arg2,arg3,arg4) | no | overlay(arg1 placing arg4 from arg2 for arg3) | この関数はサポート済みとして報告されません。引数の順序が変更され、(例えば準備済み文で)問題になる可能性があるためです。 |
| lcase(arg1) | yes | lower(arg1) | |
| left(arg1,arg2) | yes | substring(arg1 for arg2) | |
| length(arg1) | yes | length(trim(trailing from arg1)) | |
| locate(arg1,arg2) | no | position(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) | yes | trim(leading from arg1) | |
| repeat(arg1,arg2) | yes | repeat(arg1,arg2) | |
| replace(arg1,arg2,arg3) | yes | replace(arg1,arg2,arg3) | 7.3以上のサーバでのみサポート済みと報告されます。 |
| right(arg1,arg2) | no | substring(arg1 from (length(arg1)+1-arg2)) | arg1が二重化されるため、サポート済みとして報告されません。 |
| rtrim(arg1) | yes | trim(trailing from arg1) | |
| space(arg1) | yes | repeat(' ',arg1) | |
| substring(arg1,arg2) | yes | substr(arg1,arg2) | |
| substring(arg1,arg2,arg3) | yes | substr(arg1,arg2,arg3) | |
| ucase(arg1) | yes | upper(arg1) | |
| soundex(arg1) | no | soundex(arg1) | fuzzystrmatch contribモジュールが必要であるため、サポート済みとして報告されません。 |
| difference(arg1,arg2) | no | difference(arg1,arg2) | fuzzystrmatch contribモジュールが必要であるため、サポート済みとして報告されません。 |
表 8.3. サポート済みのエスケープされた日付/時刻関数
| 関数 | サポート済みとして報告されているか | 変換内容 | 注釈 |
|---|
| curdate() | yes | current_date | |
| curtime() | yes | current_time | |
| dayname(arg1) | yes | to_char(arg1,'Day') | |
| dayofmonth(arg1) | yes | extract(day from arg1) | |
| dayofweek(arg1) | yes | extract(dow from arg1)+1 | 想定する1-7までの範囲にするために1を足さなければなりません。 |
| dayofyear(arg1) | yes | extract(doy from arg1) | |
| hour(arg1) | yes | extract(hour from arg1) | |
| minute(arg1) | yes | extract(minute from arg1) | |
| month(arg1) | yes | extract(month from arg1) | |
| monthname(arg1) | yes | to_char(arg1,'Month') | |
| now() | yes | now() | |
| quarter(arg1) | yes | extract(quarter from arg1) | |
| second(arg1) | yes | extract(second from arg1) | |
| week(arg1) | yes | extract(week from arg1) | |
| year(arg1) | yes | extract(year from arg1) | |
| timestampadd(argIntervalType,argCount,argTimeStamp) | yes | ('(argIntervalTypeとargCountに従った時間間隔)'+argTimeStamp) | バックエンドでサポートしていませんので、SQL_TSI_FRAC_SECONDのargIntervalType値は実装されていません。 |
| timestampdiff(argIntervalType,argTimeStamp1,argTimeStamp2) | not | argTimeStamp2-argTimeStamp1を元にしたextract((argIntervalTypeに従う時間間隔) from argTimeStamp2-argTimeStamp1 ) | SQL_TSI_FRAC_SECOND、SQL_TSI_FRAC_MINUTE、SQL_TSI_FRAC_HOUR、SQL_TSI_FRAC_DAYのargIntervalType値のみがサポートされます |
表 8.4. サポート済みのエスケープされたその他の関数
| 関数 | サポート済みとして報告されているか | 変換内容 | 注釈 |
|---|
| database() | yes | current_database() | 7.3以上のサーバでのみサポート済みと報告されます。 |
| ifnull(arg1,arg2) | yes | coalesce(arg1,arg2) | |
| user() | yes | user | |