2015-06-13 13 views
7

Ho una test colonna tabella con array di int e valori come {1000,4000,6000} o {1000} o {1000,4000} chiamati ekw. Questi valori corrispondono a una stringa di descrizione in un altro tavoloPostgreSQL valore matrice integer uniscono per intero in altra tabella con stringa desc

tab: test 
id | name | ekw 
----------------- 
1 | One | {1000} 
2 | Two | {1000,4000} 
3 | Three | {1000,4000,6000} 

tab: ekwdesc 
id | value | desc 
----------------- 
1 | 1000 | Max 
2 | 2000 | Tim 
3 | 3000 | Rita 
5 | 4000 | Sven 
6 | 5000 | Tom 
7 | 6000 | Bob 

è possibile selezionare queste colonne e stampare le stringhe?

qualcosa di simile:

select name, ekw from test, ekwdesc 

Mi piacerebbe vedere questo risultato:

id | name | ekwdesc 
----------------- 
1 | One | Max 
2 | Two | Max, Sven 
3 | Three | Max, Sven, Bob 

Ho provato con e tutta, ma non poteva farlo funzionare.

risposta

11

Hai avuto l'idea giusta per utilizzare l'operatore any per il join. Una volta che il join è completo, tutto quello che resta è quello di utilizzare string_agg per trasformare il risultato al formato desiderato:

SELECT name, STRING_AGG(description, ', ') 
FROM  test 
JOIN  ekwdesc ON ekwdesc.value = ANY(test.ekw) 
GROUP BY name 

Vedi l'allegato SQLFiddle per un esempio eseguibile.

+0

Ciò garantisce che i tag descrizione verranno restituiti nell'ordine corretto: l'ordine dei valori nell'array ekw? – Sigfried

+0

@Sigfried Nope. –

+0

Questa soluzione può essere modificata per funzionare nel caso in cui la tabella principale abbia campi json? come sai, non puoi usare group by per le colonne JSON. – eyeinthebrick