やりたいこと
- Redshiftのテーブルに対してLIKEで部分一致。
- LIKEの条件は外部から入力されるため、PreparedStatementを用いる
なぜかエラーになる
- PreparedStatementで
LIKE ? escape'@'
のように設定 -
%0@%
のようなものをbindする。→ ex)0%
,20%
,100%
...
上記の要領で実装すると、以下のエラーがでてしまう。
Specified types or functions (one per INFO message) not supported on Redshift tables
いやそんなテーブルには触れてないし関数らしきものも使ってないつもりだが。
手打ちだと
以下のクエリを直接実行すると、問題なく通る。
SELECT name FROM hoge WHERE name LIKE '%0@%' ESCAPE '@';
ぐぬぬ...
何が悪い?
上記エラーではINFO見てよと言っているようだが、処理中ではRedshiftからのINFOメッセージが出せていなかったので、手打ちでPreparedをやってみる。こんなのめったに書かない。
PREPARE pstmt(text) AS SELECT name FROM hoge WHERE name LIKE $1 ESCAPE '@';
↓
エラー!!
INFO: Function "like_escape(text,text)" not supported.
ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.
なんか勝手にFunctionを使ってることになってる模様。
試しにESCAPEをとってみると
PREPARE pstmt(text) AS SELECT name FROM hoge WHERE name LIKE $1;
↓
通った!!
結局
- ESCAPE句は使わず、エスケープパターンはデフォルトの
\\
(バックスラッシュ2つ)にすれば、PreparedStatementでも処理できた。 - MySQLでは(構文は異なるが)PREPARE文においてもESCAPE句が設定できる。
バックスラッシュ2つって、なんかすごくバグ含みそうでイヤなんだけどなぁ。。。