[pgsql-jp: 33688] Re: [Q]配列内の文字列検索について
Tatsuo Ishii
t-ishii @ sra.co.jp
2004年 7月 16日 (金) 10:15:29 JST
石井です.
いいですね,こういうSQLの質問.ちょっと「SQLパズル」みたいで:-)
> test=# select * from t3 where '%秋田叢書' = any(data);
> の検索をしてみると
> title_code | tag | data
> ------------+-----+------
> (0 rows)
> と言われました。ついでに
> test=# select * from t3 where '新秋田%' = any(data);
> もやってみたのですが
> title_code | tag | data
> ------------+-----+------
> (0 rows)
> と言われてしまいました。多分ダメだろうと思いつつ
> test=# select * from t3 where '%秋田%' = any(data);
> もやってみましたが、案の定
> title_code | tag | data
> ------------+-----+------
> (0 rows)
> と言われてしまいました。
> いわゆる
> select hoge from fuga where data like '%....';
> とか
> select hoge from fuga where data like '%....%';
> を、配列全体に関して行う方法ってあるんでしょうか?
LIKE + ANY でなぜうまくいかないかについてはすでに他の方が指摘されてい
る通りです.
そこで以下のような方法を考えました.
まず,単にLIKEの左右の引数を引っくり返すだけの関数mytextlikeを作ります
(textlikeは,TEXT型用のLIKEの実体となる関数です).
CREATE FUNCTION mytextlike(TEXT, TEXT) RETURNS BOOL AS '
SELECT textlike( $2, $1);' LANGUAGE SQL;
これだけではまだ駄目です.というのは,
mytextlike('a%', any(data))
みたいなことはできないからです.ANYは構文要素で,関数ではありませんか
ら.そこで,mytextlikeを使って演算子を定義します.
CREATE OPERATOR @#@ (procedure = mytextlike, leftarg = text, rightarg = text);
これでめでたく以下のような使い方ができるはずです.
select * from t3 where '%秋田叢書' @#@ any(data);
残念ながら,LIKEそのものではありませんが...
--
Tatsuo Ishii
pgsql-jp メーリングリストの案内