2011-09-03 16 views
7

He creado una serie de vistas en una base de datos PostgreSQL que incluye un par de columnas de matriz. La definición de la vista es el siguiente:Encontrar una cadena dentro de una columna de matriz en 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'); 

Básicamente lo que quiero hacer es un iLike en la columna de 'autor' para determinar si existe un identificador de usuario específico en la matriz. Obviamente no puedo usar iLike en ese tipo de datos, así que necesito encontrar otro enfoque.

Aquí es un ejemplo de los datos en la matriz 'autores:

{ "(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, Autor, 1, Nicholas, K., Kreidberg, \" \ ", 123456789, t, 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, Autor, 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 343, A00592, Autor, 3, Jane, E, Doe, \ "\", 345678901, t, Admin, A, A, A ,, \ "\") "," (2383, t, f, f, \ "2011-08-09 15: 35: 11.845283 \", 567890123, \ "2011-08-09 15: 36: 29.291388 \", 000128343, A00592, Autor, 4, Prueba, T, Testerton, \ "\ ", TestTesterton, f, N/A, A, A, \" \ ")"}

Lo que quiero hacer es consultar la vista y averiguar si la cadena ' 123456789 '(que es la identificación de usuario asignada a Nicholas Kreidberg en la matriz) existe en la matriz. No me importa a qué usuario está asignado o dónde aparece en la matriz, todo lo que necesito saber es si aparece '123456789' en cualquier lugar de la matriz.

Una vez que sé cómo escribir una consulta que determina si la condición anterior es verdadera, mi aplicación simplemente ejecutará esa consulta y si se devuelven las filas sabrá que el ID de usuario pasado a la consulta es autor de esa publicación y proceda en consecuencia.

Gracias de antemano por cualquier idea que se pueda proporcionar sobre este tema.

+4

¿Hay alguna razón por la que no pueda usar una estructura de base de datos adecuada? Es decir. una tabla separada para los autores y en caso de que sea una relación m: n una tabla que mapea los artículos a los autores. – ThiefMaster

+3

@ThiefMaster Las matrices son proporcionadas por postgres y es una pregunta razonable preguntar cómo buscar dentro de una. –

+0

@Dana, sigue siendo un anti-patrón (sin normalización, sin índice posible, las uniones son un dolor, la búsqueda es un dolor y son súper lentas). – Johan

Respuesta

17

podría esto:

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

hacer el truco?

De lo contrario, no es la función de unnest ...

En el capítulo "Array Functions and Operators" tiene más detalles.

Cuestiones relacionadas