2012-06-26 16 views
9

zapytanie:Zapytanie o wartości elementów macierzy (PostgreSQL)

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

wytwarza żądane wyniki. Chciałbym jednak wykluczyć (niezagrożone) wiersze, które pasują do pewnej wartości. Dodanie warunku do zapytania, takiego jak:

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

oczywiście nie działa. czy to możliwe? W jaki sposób?

Odpowiedz

7

Jeśli przez unnest(Table2.L) != '-' znaczy

wyrzucić wszystkie unnested elementy, które są '-'

następnie użyć tabeli pochodzącą i odfiltrować wartości unnested nie chcesz:

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 ; 

Jeśli masz na myśli

ignorować wszystkie wiersze z Table2 gdzie L zawiera '-'

następnie można użyć @> operator aby sprawdzić, czy L zawiera pewien element:

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

lub można użyć ANY:

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

I zrób to sam przysługę, zapominając, że istnieją niejawne łączenia, zawsze używaj wyraźnych warunków łączenia.

+0

miałem na myśli pierwszy scenariusz w swojej odpowiedzi, ale dzięki za dodatkowe informacje zbyt. – SabreWolfy

2

Kolejny sposób to zrobić:

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; 

maja nie może być szybciej. Zależy od tego, jak selektywna jest klauzula WHERE. Uruchom szybki EXPLAIN ANYLYZE.

Należy zauważyć, że rozplątałem table1 i table2, które są odwrócone w tym przykładzie. Jeśli jesteś całkowicie zdezorientowany, spróbuj zastąpić x ->y w klauzuli WHERE i ORDER BY.

Jeśli rzeczywiście chcą wyeliminować wystąpienia - po obu stronach, aby dodać AND y <> '-' klauzuli WHERE - zarówno symetryczne (nie cuonfusion możliwe).
Chciałbym również ORDER BY x, y, jeśli x nie ma gwarancji, że jest unikatowe, aby porządek sortowania był stabilny.

Demo on sqlfiddle.

+0

Istnieje ~ 350 wierszy, które pasują po wykluczeniu wierszy '' -'''. Twoja odpowiedź daje ~ 34000, więc coś jest nie tak gdzieś :) Sprawdzam to teraz. Ponadto mogłem dołączyć dodatkowe kolumny z 'Table2' w zapytaniu, które" mu jest zbyt krótkie ", ale nie jestem w stanie tego zrobić z twoją odpowiedzią. – SabreWolfy

+0

Musi być jakieś nieporozumienie. Dodałem trochę do mojej odpowiedzi, aby wyjaśnić. –

Powiązane problemy