10

次のクエリ:

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

望ましい結果が得られます。ただし、ある値に一致する(ネストされていない)行を除外したいと思います。次のような条件をクエリに追加します。

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

明らかに機能しません。これは可能ですか?どのように?

4

2 に答える 2

9

もしunnest(Table2.L) != '-'あなたが意味するなら

ネストされていない要素をすべて破棄します'-'

次に、派生テーブルを使用して、不要なネストされていない値を除外します。

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 ;

あなたが意味するなら

が含まれてTable2いる場所からのすべての行を無視しますL'-'

次に、@>演算子Lを使用して、特定の要素が含まれているかどうかを確認できます。

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

またはあなたは任意を使用することができます

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

また、暗黙的な結合が存在することを忘れて、常に明示的な結合条件を使用してください。

于 2012-06-26T20:40:47.557 に答える
3

それを行う別の方法:

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;

5月は速くないかもしれません。WHERE句の選択度によって異なります。クイックを実行しますEXPLAIN ANYLYZE

例では逆になっているtable1とを解いたことに注意してください。table2すべての明確さに混乱している場合は、and句をx->に置き換えてみてください。yWHEREORDER BY

-実際に両側での発生を排除したい場合はAND y <> '-' 、WHERE句に追加して対称にします(cuonfusionは不可能です)。
またORDER BY x, y、xが一意であることが保証されていない場合は、並べ替え順序を安定させます。

sqlfiddleのデモ。

于 2012-06-26T21:29:17.700 に答える