Edited at

RedshiftのLIKE句でハマる

More than 3 years have passed since last update.


やりたいこと


  • 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つって、なんかすごくバグ含みそうでイヤなんだけどなぁ。。。