2016-09-21 8 views
1

によって返されました。結果のテーブル内のデータが次のようになります。フィルタデータは、私はそうのように見える非常に単純なクエリを、持っている機能

{1} 
{1,2} 
{1} 

私は、このデータをフィルタリングする方法の多くを試してみました - {2}を含むすべての行を取得するには、言います。しかし、私は失敗しました。

SELECT path FROM (
    SELECT (ST_DumpPoints(geom)).path as path FROM layer_60_ 
) t WHERE path @> '{2}'::integer[] 

この場合、サブクエリを使用すると、過度のように見えます。サブクエリなしですぐにフィルタリングする可能性はありますか?私自身の試みは失敗に終わった:

SELECT (ST_DumpPoints(geom)).path as path FROM layer_60_ WHERE path ... # indeed, wrong 

SELECT (ST_DumpPoints(geom)).path as path FROM layer_60_ HAVING path ... # wrong 

SELECT * FROM layer_60_ WHERE (ST_DumpPoints(geom)).path ... # does not work 

SELECT (ST_DumpPoints(geom)).path as path FROM layer_60_ GROUP BY path HAVING path ... # wrong!!! 

それでは、何が問題なのですか?サブクエリよりも単純な解決策がありますか?

答えて

2

サブクエリを使用しても問題はありません。プランナーは、サブクエリを単一プランに折り畳むことになります。クエリの作成が簡単で、サブクエリを使用して理解して維持することができれば、是非、まずは進んでください。パフォーマンスペナルティはありません(optimization barriersを使用しない限り)。あなたのケースでは

、あなたが本当に行ソースとしてそれを使用する必要がありますので機能ST_DumpPoints()は、集合を返す関数であり、それは、サブクエリせず、あなたがやりたいというが容易となる。

SELECT p.path 
FROM layer_60_, ST_DumpPoints(geom) p(path, geom) 
WHERE p.path @> '{2}'::integer[]; 

関数は、前の表の行ごとに1回評価され、次に結合条件が指定されているかのように行が結合されます。その後、関数出力の列を参照することができます。

+0

contains演算子の代わりに 'ANY'を使用する方が良いでしょうか? '2 = ANY(p.path)'のように? – icuken

関連する問題