LoginSignup
4
4

More than 5 years have passed since last update.

RedshiftのLIKE句でハマる

Last updated at Posted at 2015-08-27

やりたいこと

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

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4