在PostgreSQL中的数组列中查找字符串

时间:2011-09-03 00:28:06

标签: sql database arrays 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');

基本上我想做的是在'author'列上进行iLike,以确定该数组中是否存在特定的用户ID。显然我不能在该数据类型上使用iLike,所以我需要找到另一种方法。

以下是'authors'数组中的数据示例:

  

{ “(2373,T,F,F,\” 2011-08-01   11:57:40.696496 \ “/酒吧/ pubs_edit_article.php,\” 2011-08-09   15:36:29.281833 \ “000128343,A00592,作者,1,尼古拉斯,K.,Kreidberg,\ ”\“,123456789,T,管理员,A,A,A,0,\ ”\“)”,” (2374,T,F,F,\“2011-08-01   11:57:40.706617 \ “/酒吧/ pubs_edit_article.php,\” 2011-08-09   15:36:29.285428 \ “000128343,A00592,作者,2,约翰,D.,DOE,\ ”\“,234567890,吨,IT,A,A,A,0,\ ”\“)”,” (2381,T,F,F,\“2011-08-09   14:45:14.870418 \ “000128343,\” 2011-08-09   15:36:29.28854 \ “000128343,A00592,作者,3,简,E,DOE,\ ”\“,345678901,T,管理员,A,A,A ,, \ ”\“)”,“(2383 ,T,F,F,\“2011-08-09   15:35:11.845283 \ “567890123,\” 2011-08-09   15:36:29.291388 \ “000128343,A00592,作者,如图4所示,测试,T,Testerton,\ ”\“,TestTesterton,F,N / A,A,A,A ,, \ ”\“)”} < / p>

我想要做的是查询视图并查明数组中是否存在字符串'123456789'(即数组中分配给Nicholas Kreidberg的用户ID)。我不关心它被分配给哪个用户或它在数组中出现的位置,我需要知道的是,如果'123456789'显示在数组中的任何位置。

一旦我知道如何编写一个确定上述条件是否为真的查询,那么我的应用程序将只执行该查询,如果返回行,则会知道传递给查询的用户ID是该发布的作者,相应地进行。

提前感谢您就此主题提供的任何见解。

2 个答案:

答案 0 :(得分:23)

可能这个:

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

诀窍?

否则,有unnest函数......

&#34; Array Functions and Operators&#34;章节有更多细节。

答案 1 :(得分:4)

ANY()函数可以为您完成这项工作:

SELECT * FROM people WHERE '123456789' = ANY(authors);

鉴于people.authors的类型为text[]