2011-09-03 27 views
7

PostgreSQLデータベースにいくつかの配列列を含む一連のビューを構築しました。次のようにビューの定義は次のとおりです。基本的にPostgreSQLの配列列内の文字列を見つける

create view articles_view as 
    (select articles.*, 
    array(select row(people.*)::people 
    from people 
    where articles.spubid=people.spubid and 
     people.stype='Author' and 
     bactive='t' 
    order by people.iorder) as authors, 
    array(select row(people.*)::people 
    from people 
    where articles.spubid=people.spubid and 
     people.stype='Editor' and 
     bactive='t' 
    order by people.iorder) as editors, 
    array(select row(people.*)::people 
    from people 
    where articles.spubid=people.spubid and 
     people.stype='Reviewer' and 
     bactive='t' 
    order by people.iorder) as reviewers, 
    array(select row(status.*)::status 
    from status 
    where articles.spubid=status.spubid and 
     bactive='t') as status 
    from articles 
    where articles.bactive='t'); 

私が何をしたいのか、特定のユーザIDはその配列中に存在するかどうかを決定するために「著者のコラムにiLikeのです。明らかに、私はそのデータ型でiLikeを使うことができないので、別のアプローチを見つける必要があります。ここ

は「著者のアレイ内のデータの例である:

{ "(2373、T、F、F、\" 2011-08-01 11:57:40.696496 \」、 /Pubs/pubs_edit_article.php,\"2011-08-09 15:36:29.281833 \ "、000128343、A00592、著者、Nicholas、K.、Kreidberg、\" \ 123456789、t、Admin、A 、 "Pubs/pubs_edit_article.php、\" 2011年08月01日 11:57:40.706617 \ "、"(2374、t、f、f、\ " -08-09 15:36:29.285428 "、000128343、A00592、著者、2、John、D.、Doe、\"、234567890、t、IT、A、A、A、0、\ " ")"、 "(2381、t、f、f、\" 2011-08-09 14:45:14.870418 \ "、000128343、\" 2011-08-09 15:36:29.28854 \ "、000128 "、"(2383、t、f、f、\、 "、" A "、" A "、" "2011-08-09 15:35:11.845283"、567890123、 "2011-08-09 15:36:29.291388"、000128343、A00592、著者、4、テスト、T、テスタートン、 "、TestTesterton、f、N/A、A、A、A、A"、 "") "")

私ができることを望むのは、ビューを照会し、 123456789 '(配列内のNicholas Kreidbergに割り当てられたユーザーID)が配列に存在します。どのユーザーに割り当てられているか、配列に表示されている場所に関わらず、配列のどこにでも '123456789'が表示されていれば分かります。

上記の条件が真であるかどうかを判断するクエリを作成する方法がわかったら、アプリケーションは単にそのクエリを実行し、行が返された場合、クエリに渡されたユーザーIDがそのパブリケーションの作成者であることがわかりますそれに応じて進んでください。

このトピックで提供できる洞察を前もってありがとうございます。

+4

適切なデータベース構造を使用できない理由はありますか?私。著者のための別のテーブルと、それがm:nの関係の場合は、記事を著者にマッピングするテーブルです。 – ThiefMaster

+3

@ThiefMaster配列はpostgresによって提供されています。その配列内で検索する方法は妥当な質問です。 –

+0

@Dana、それはまだアンチパターンです(正規化なし、可能なインデックスなし、結合は苦痛です、検索は苦痛で遅いです)。 – Johan

答えて

17

は、この可能性があります:

select ... 
    from ... 
where ... 
     and array_to_string(authors, ', ') like '%123456789%';` 

トリックを行いますか?

そうでない場合は、unnest機能がある...

"Array Functions and Operators" の章では詳細を持っています。