[pgsql-jp: 33690] Re: [Q]配列内の文字列検索について

Yoshio Funaki yoshio @ apl.pref.akita.jp
2004年 7月 16日 (金) 11:29:22 JST


お世話になっております。船木@秋田県立図書館です。
Mashikiさん、石井さん、ご教示痛み入ります。

>石井です.
>
>いいですね,こういうSQLの質問.ちょっと「SQLパズル」みたいで:-)

第1回off meetingの時、厚顔無恥にも石井さんにデータをご覧いただき、
ご示唆頂いた「Web蔵書検索DB」に、まだまだ満足できなくてこんな事やってます。 ^^;

Mashikiさんにご教示頂いた
>の代用記法として
>
>select * from t3
> where array_to_string(data,' ')||' ' ~ '秋田叢書 ';
>
>もしくは
>
>select * from t3
> where array_to_string(data,' ')||' ' like '%秋田叢書 %';

ですが、データ内に全角空白がありますので、前提条件が崩れてしまいますので
残念ながら無理のようです。

で、石井さん案の

>まず,単に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);

で、実際やってみました。
test=# select * from t3 where '%秋田叢書' @#@ any(data);
    title_code    | tag  |     data
------------------+------+--------------
 5010000036       | 251A | {新秋田叢書}
 5010000036       | 551B | {新秋田叢書}
 5010000037       | 251A | {新秋田叢書}
 5010000037       | 551B | {新秋田叢書}
 5010000038       | 251A | {新秋田叢書}
 5010000038       | 551B | {新秋田叢書}
 5010000039       | 251A | {新秋田叢書}
 5010000039       | 551B | {新秋田叢書}

ついでに
test=# select * from t3 where '%秋田%' @#@ any(data);
    title_code    | tag  |          data
------------------+------+-------------------------------
 5010000003       | 251F | {秋田魁新報社/編}
 5010000003       | 270A | {秋田}
 5010000003       | 751B | {秋田魁新報社}
 5010000003       | 270B | {秋田魁新報社}
 5010000003       | 770B | {秋田魁新報社}
 5010000003       | 960B | {秋田県立図書館}
 5010000030       | 960B | {秋田県立図書館}
 5010000031       | 960B | {秋田県立図書館}
 5010000032       | 270B | {秋田民報社}
 5010000032       | 770B | {秋田民報社}
 5010000032       | 960B | {秋田県立図書館}
---------------(途中snip)------------------
 5010000036       | 251A | {新秋田叢書}
 5010000036       | 551B | {新秋田叢書}
 5010000036       | 960B | {秋田県立図書館}
 5010000037       | 251A | {新秋田叢書}
 5010000037       | 551B | {新秋田叢書}
 5010000037       | 960B | {秋田県立図書館}
となり、希望の動作ができることを確認いたしました。

>残念ながら,LIKEそのものではありませんが...

ということで、認識としては
 「現在のPostgreSQLのarray実装では
  select hoge from fuga where 'data' like arr[];
  みたいな単純な表記で配列内データに対する部分一致検索はできないので
  一工夫必要である。その工夫として、石井さん案がある」
と言うことですね。

# これでexttable-0.5がまともに動けば考えてることが実現できるんですが
# うまく動いてくれない・・・ ;_;
# この件に関しては、また別便にてご教示をお願いいたします。

ご教示頂きました皆様、重ねてお礼申し上げます。

----
Yoshio Funaki  yoshio @ apl.pref.akita.jp



pgsql-jp メーリングリストの案内