PostgreSQLのWhrere時の型チェックの厳密化

CakePHPでDBはPostgreSQLのサイトがある。
そちらを移転作業したときに起きた問題

動作チェック中に下記のエラーが発生

Query failed: ERROR:  operator does not exist: date ~~ unknown
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

HINTから情報を検索するとPostgreSQLのバージョンで検索(Where)のキャスト(型)のチェックが厳密化されたようです。

今回はPostgreSQL7.4.23 → 9.2.10

厳密化は8.3からのようです。
キャストの厳密化とは検索するときにフィールドの型を厳密にチェックするようです。
今までのバージョンは型を自動で変換してくれていたようですが、8.3からはそれを行わないとのこと

WHERE field_int = '1' // int型に文字列を投げるとか


WHERE field_text = 1// text型に数値をなげるとか

それらがNGとのこと

私のプログラムのエラーはdate型にLIKE検索をしているのがNGでした。

対策としてはFunctionとCastを作成してそれで型の変換をさせる方法があるようですが、
次の移転時にまた困るような気がしたので、今回はプログラム側の修正を行いました。
(プログラムの修正箇所が少なかったため)

CakePHPを使っているのですが下記の修正ではエラーでした。

array(“date::text”=>”2017-11%”)

ということで、ちゃんと関数で変換します。

array("to_char(date, 'yyyy-mm')"=>"2017-11")

エラーなく検索結果が返ってきたらOK

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA