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.
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 ... –
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 –
Mais @Erwin ces 2 jointures à gauche servent à des fins différentes. –