[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 メーリングリストの案内