Найти строку в столбце массива в PostgreSQL - PullRequest
11 голосов
/ 03 сентября 2011

Я построил серию представлений в базе данных 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');

По сути, я хочу сделать 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, Автор, 1, Николай К., Крейдберг, \" \ ", 123456789, т.Admin, A, A, A, 0, \ "\") "," (2374, t, f, f, \ "2011-08-01 11: 57: 40.706617 \", / Pubs / pubs_edit_article.php, \"2011-08-09 15: 36: 29.285428 \", 000128343, A00592, Автор, 2, Джон, Д., Доу, \ "\", 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, т, Admin, А, А, А ,, \ "\")», "(2383, т, е, е, \" 2011-08-09 15: 35: 11.845283 \ ", 567890123 \", 2011-08-09 15: 36: 29.291388 \ ", 000128343, A00592, Автор, 4, Test, T, Testerton, \" \ ", TestTesterton, f, N / A, A, A, A ,, \ "\") "}

Я хочу иметь возможность запросить представление и выяснить, является ли строка '123456789'(то есть идентификатор пользователя, назначенный Николасу Крайдбергу в массиве) существует в массиве.Мне все равно, какому пользователю он назначен или где он появляется в массиве, все, что мне нужно знать, - это если в любом месте массива появляется «123456789».

Как только я знаю, как написать запроскоторый определяет, является ли указанное выше условие истинным, тогда мое приложение просто выполнит этот запрос, и если строки будут возвращены, он будет знать, что идентификатор пользователя, переданный в запрос, является автором для этой публикации, и будет действовать соответствующим образом.

Спасибо взаранее за любую информацию, которая может быть предоставлена ​​по этой теме.

1 Ответ

24 голосов
/ 03 сентября 2011

Могу ли это:

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

сделать трюк?

В противном случае есть функция unnest ...

Функции массива ""и операторы"глава имеет больше деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...