2012-06-26 20 views
9

La query seguente:Query sul valore di elementi array (PostgreSQL)

select unnest(Table2.L) as X, unnest(Table1.O) 
from Table1, Table2 
where Table1.code = Table2.code 
order by X ; 

produce i risultati desiderati. Vorrei, tuttavia, voler escludere (non innestate) le righe che corrispondono a qualche valore. Aggiunta di una condizione alla query, ad esempio:

and unnest(Table2.L) != '-' 

ovviamente non funziona. È possibile? Come?

risposta

7

Se per unnest(Table2.L) != '-' intendi

buttare fuori tutti gli elementi che sono unnested '-'

quindi utilizzare una tabella derivata e filtrare i valori unnested non si vuole:

select * 
from (
    select unnest(Table2.L) as X, unnest(Table1.O) 
    from Table1 join Table2 on Table1.code = Table2.code 
) dt 
where X != '-' 
order by X ; 

Se intendi

ignorare tutte le righe da Table2 dove L contiene '-'

quindi è possibile utilizzare il @> operator per verificare se L contiene un certo elemento:

select unnest(Table2.L) as X, unnest(Table1.O) 
from Table1 join Table2 on Table1.code = Table2.code 
where not Table1.L @> ARRAY['-'] 

o si potrebbe usare ANY:

select unnest(Table2.L) as X, unnest(Table1.O) 
from Table1 join Table2 on Table1.code = Table2.code 
where not '-' = any(Table1.L) 

E fai da te un favore dimenticando che esistono join impliciti, usate sempre condizioni di join esplicite.

+0

Intendevo il primo scenario nella sua risposta, ma grazie per le informazioni aggiuntive troppo. – SabreWolfy

2

Un altro modo di farlo:

SELECT x, y 
FROM (SELECT code, unnest(l) AS x FROM table1) t1 
JOIN (SELECT code, unnest(o) AS y FROM table2) t2 USING (code) 
WHERE x <> '-' 
ORDER BY x; 

maggio potrebbe non essere più veloce. Dipende da quanto sia selettiva la clausola WHERE. Esegui un rapido EXPLAIN ANYLYZE.

Nota che ho districato table1 e table2, che sono invertiti nell'esempio. Se si è confusi da tutta la chiarezza, provare a sostituire x -> nella clausola WHERE e ORDER BY.

Se si vuole realmente eliminare le occorrenze di - su entrambi i lati, aggiungere AND y <> '-' alla clausola WHERE - rendendo (possibile senza cuonfusion) è simmetrica.
Vorrei anche ORDER BY x, y, se x non è garantito che sia univoco, per rendere stabile l'ordinamento.

Demo on sqlfiddle.

+0

Ci sono ~ 350 righe che corrispondono dopo aver escluso le righe ''-''. La tua risposta dà ~ 34000, quindi qualcosa non va da qualche parte :) Lo sto verificando ora. Inoltre, sono stato in grado di includere colonne aggiuntive da "Table2" nella query che "mu è troppo breve", ma non sono in grado di farlo con la tua risposta. – SabreWolfy

+0

Ci deve essere una sorta di incomprensione. Aggiunto un po 'alla mia risposta per chiarire. –

Problemi correlati