category: データベース
DATE : 2007/09/25 (Tue)
DATE : 2007/09/25 (Tue)
DISTINCT 句を用いると、重複行を除去することができます。しかし、DISTINCT 句内で幾何オブジェクト(Geometry)を指定する場合には、幾何オブジェクトそのものを評価しているのか、幾何オブジェクトの境界(Boundary Box)を評価しているのか注意しなければいけません。
幾何オブジェクト同士の比較方法として「~=(幾何オブジェクトそのものの比較)」と「=(幾何オブジェクトの境界の比較)」の両方があります。DISTINCT 句や、その他の値同士を比較して出力行を変化させるような句では、「=(幾何オブジェクトの境界の比較)」で評価されます。つまり、特定の精度を越えた違いは全て同じと見なされてしまいます。
そのため、以下のような SQL 文を実行すると、重複していないにもかかわらず出力されない幾何オブジェクトが出てくる場合があります。この SQL 文は、点(POINT)オブジェクトの格納されたテーブル( point )から、重複する点オブジェクトを除いて出力することを想定しています。点オブジェクトは、location 列に格納されているものとします。
SELECT DISTINCT ON ( location ) location FROM point;
この問題は、幾何オブジェクトをバイナリに変換することで解決できます。バイナリに変換した上での SQL 文は、次の通りです。
SELECT DISTINCT ON ( ST_AsBinary( location ) ) location FROM point;
関連記事
参考文献
PR
忍者ブログ [PR]