2011-01-21 3 views
2

J'ai 2 tables:requête PostgreSQL impliquant entier []

CREATE TABLE article ( 
    id serial NOT NULL, 
    title text, 
    tags integer[] -- array of tag id's from TAG table 
) 

CREATE TABLE tag (
    id serial NOT NULL, 
    description character varying(250) NOT NULL 
) 

... et doivent sélectionner des étiquettes de table TAG tenue dans 'balises de nombre entier []' de ARTICLE basé sur le titre de l'article.

donc essayé quelque chose comme

SELECT * 
    FROM tag 
WHERE tag.id IN ((select article.tags::int4 
         from article 
        where article.title = 'some title')); 

... qui me donne

ERROR: cannot cast type integer[] to integer
LINE 1: ...FROM tag WHERE tag.id IN ( (select article.tags::int4 from ...

Je suis coincé avec PostgreSql 8.3 à la fois environnement de développement et de production.

Répondre

4

Utilisez le tableau chevauche l'opérateur &&:

SELECT * 
    FROM tag 
    WHERE ARRAY[id] && ANY (SELECT tags FROM article WHERE title = '...'); 

aide contrib/intarray vous pouvez même indexer ce genre de chose plutôt bien.

+0

C'est assez cool –

4

Jetez un oeil à la section « 8.14.5. Searching in Arrays », mais considérer la pointe à la fin de cette section:

Tip: Arrays are not sets; searching for specific array elements can be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale better for a large number of elements.

2

Vous ne mentionnaient pas votre version Postgres, donc je suppose que vous utilisez un haut-To- version à jour (8.4, 9.0)

Cela devrait fonctionner alors:

 
SELECT * 
    FROM tag 
WHERE tag.id IN (select unnest(tags) 
        from article 
        where title = 'some title'); 

Mais vous devriez vraiment envisager de modifier la conception de votre table.

Modifier

Pour 8.3 la fonction unnest() peut facilement être ajouté, voir cette page wiki:
http://wiki.postgresql.org/wiki/Array_Unnest

+0

... Bummer, j'ai 8,3, à la fois dev et prod :-( – vector

+0

... vous me pariez, c'est ce que j'ai trouvé :-) – vector