2016-11-07 1 views
1

Comme suivi à la question précédente:Postgres DE requête avec l'un des noms de colonne

je la requête suivante:

SELECT row_number() OVER (ORDER BY t.id) AS id 
    , t.id AS "RID" 
    , count(DISTINCT a.ord) AS "Matches" 
FROM tbl t 
LEFT JOIN (
    unnest(array_content) WITH ORDINALITY x(elem, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(elem, ',')) txt 
    ) a ON t.description ~ a.txt 
     OR t.additional_info ~ a.txt 
GROUP BY t.id; 

qui me donne correspond correctement, mais maintenant la valeur pour array_content doit être dynamique et aussi celle de la valeur de la colonne.

Disons que je me sers d'une fonction d'agrégation pour obtenir le contenu du tableau dans la requête comme:

SELECT row_number() OVER (ORDER BY t.id) AS id 
    , t.id AS "RID" 
    , array_agg(DISTINCT demo_a.element_demo) as array_values 
    , count(DISTINCT a.ord) AS "Matches" 
    , count(DISTINCT demo_a.ord) AS "Demo_Matches" 
FROM tbl t 
LEFT JOIN (
    unnest(array_values) WITH ORDINALITY x(elem, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(elem, ',')) txt 
    ) a ON t.description ~ a.txt 
     OR t.additional_info ~ a.txt 
LEFT JOIN (
    unnest("test1","test2"::varchar[]) WITH ORDINALITY x(element_demo, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(element_demo, ',')) text 
    ) demo_a ON i.name ~ demo_a.text 
GROUP BY t.id; 

Maintenant, ce que je dois est d'obtenir la colonne array_values en place de array_content qui est défini dans la partie unnest . C'est possible? Pour l'instant, il donne une exception à ce nom de colonne non défini.

+0

Le double-unnest ajoutée pour le simple tableau '{ "test", "test1"}' n'a pas de sens. Un seul 'unnest()' désaccorde déjà tout ce qu'il y a à désamorcer ... –

+0

Aussi, le proxy CROSS JOIN entre vos deux sous-requêtes LEFT JOIN, est presque certainement faux. Considérons l'exemple de fishmarket: http://stackoverflow.com/questions/12464037/two-sql-left-joins-produce-incorrect-result/12464135#12464135 –

+0

Mais @Erwin ces 2 jointures à gauche servent à des fins différentes. –

Répondre

0

Pour l'instant, le nom de colonne n'est pas défini.

C'est parce que vous utilisez un nom de colonne a.obj_element . Dans la sous-requête, nous avons nommé la colonne elem. (Ou avez-vous dire vraiment utiliser txt?) Donc:

SELECT row_number() OVER (ORDER BY t.id) AS id 
    , t.id AS "RID" 
    , array_agg(DISTINCT a.elem) AS array_values -- or a.txt? 
    , count(DISTINCT a.ord) AS "Matches" 
FROM tbl t 
LEFT JOIN (
    unnest(array_content) WITH ORDINALITY x(elem, ord) 
    CROSS JOIN LATERAL 
    unnest(string_to_array(elem, ',')) txt 
    ) a ON t.description ~ a.txt 
     OR t.additional_info ~ a.txt 
GROUP BY t.id; 
+0

encore il donne erreur .. array_values ​​ne existe pas .... –

+0

@SyedAsadAbbasZaidi: Oh, vous avez également renommé la colonne d'entrée 'array_content' - par erreur, je présume? –