- PR -

postgresql 配列フィールドの検索について

1
投稿者投稿内容
JJ
ベテラン
会議室デビュー日: 2003/02/25
投稿数: 61
投稿日時: 2006-02-01 19:24
postgresql-8.1のwindows版で開発を行っています。

フィールドでtext[]型を使用しています。
このフィールドの前方一致または後方一致の検索を行いたいのですが、
これは可能でしょうか?
また、可能であれば方法をご教授頂けますでしょうか?

下記のように試したのですがダメでした。

例、arry_textフィールドの「あ」の前方一致
テーブル名:tbl
フィールド名:arry_text
フィールドの型:text[]
フィールドの値:{ 'あいう','かきく','さしす','たちつ' }

@SELECT * FROM tbl WHERE 'あ' LIKE ANY(arry_text);
エラーはでない、(完全一致の方法)
ASELECT * FROM tbl WHERE 'あ' = ANY(arry_text);
エラーはでない、(完全一致の方法)
BSELECT * FROM tbl WHERE 'あ%' LIKE ANY(arry_text);
エラーはでない、前方一致ではない
CSELECT * FROM tbl WHERE 'あ%' LIKE ANY(arry_text%);
エラーになる
DSELECT * FROM tbl WHERE 'あ%' LIKE ANY('arry_text%');
エラーになる
ESELECT * FROM tbl WHERE ANY(arry_text) LIKE 'あ%';
エラーになる
FSELECT * FROM tbl WHERE arry_text LIKE 'あ%';
エラーになる
GSELECT * FROM tbl WHERE arry_text LIKE ANY('あ%');
エラーになる

以上、よろしくお願いします
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-02-01 21:25
こんな手はありでしょうか?

generate_seriesって関数で配列の添え字を返し、
その添え字に対応する要素のデータを取得する。

取得したデータに対してLIKE文で検索を行うってSQLです。

generate_seriesを取得する際に対象テーブルの列の最大添え字数を指定するため、
array_upperを用いてます。

array_upperを用いる時のテーブルレコードは1件でいいので、
適当にWhere句をつけて1件になるようにしました。
#要素数がレコードによってマチマチだと大変かも。


今回検証した前提は以下のとおりです。
testテーブルにはcol1というvarcharの配列型の列があり、
データとして
"{あいうえお,かきくけこ,さしすせそ}"
"{たちつてと,なにぬねの,はひふへほ}"
の2レコードがあるとする。



コード:
select
 col1
from 
  test , 
  ( 
    select 
      generate_series(1, array_upper (col1, 1) ) as idx
    from 
      test
    where 
      col1[1] = 'あいうえお'
   ) as rowIdx 
where 
  col1[idx] like 'は%' ;




結果
コード:
"{たちつてと,なにぬねの,はひふへほ}"


JJ
ベテラン
会議室デビュー日: 2003/02/25
投稿数: 61
投稿日時: 2006-02-02 10:28
夏椰|。σ)oさん
ご回答ありがとうございます

教えて頂いたコード+distinctで上手くいきました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)