PostGISの2つのレイヤーの違い


8

2つのレイヤーの違いを計算する正しい方法は何ですか?私は次のアプローチを使用しようとしました:

SELECT ST_Difference(river.geom, lakes.geom) 
FROM river LEFT JOIN lakes ON ST_Intersects(river.geom, lakes.geom) 

しかし、出力では、riverのどのジオメトリとも交差しないレイヤーのジオメトリが失われlakesます。左結合が期待どおりに機能しないようです。

現在、私は別のアプローチを使用していますが、これが正しいかどうかはわかりません:

SELECT ST_Difference(river.geom, lakes.geom) 
FROM river JOIN lakes ON ST_Intersects(river.geom, lakes.geom) 
UNION 
SELECT river.geom 
FROM river JOIN lakes ON NOT ST_Intersects(river.geom, lakes.geom) 

回答:


11

これを行うだけです:

SELECT COALESCE(ST_Difference(river.geom, lakes.geom), river.geom) As river_geom 
FROM river LEFT JOIN lakes ON ST_Intersects(river.geom, lakes.geom);

逆行する

SELECT COALESCE(ST_Difference(river.geom, lakes.geom), lakes.geom) As lake_geom 
FROM lakes LEFT JOIN river ON ST_Intersects(river.geom, lakes.geom);

それがコアレスの存在です。私はPostGISのセマンティクスをそのままの状態に保つことを強く望んでいます。これは、リレーショナルDBで受け入れられているテクノロジーと整合性があり、これについて私たちが同意した場合、すべての機能に対してそれを行う必要があり、その結果は予測できません。


私はstackexchangeが私の編集を取っているとは思わない。私が言うつもりだったのはCOALESCE(ST_Difference(river.geom、lakes.geom)、river.geom)だったRiver_geom ...川LEFT JOIN湖。しかし、うまくいけば、あなたはアイデアを得ます
LR1234567

6

ここでの問題は、左結合ではなく、期待どおりに機能しています。しかし、クエリが湖と交差しない川に到達すると、nullを返すように見える2番目の引数としてNULLをST_Difference関数に渡します。

/ニクラス


2
NULLを返すのは正しいことだと思いますか?Paulが述べたように-btrimなどのように動作するはずです。一致しないときに最初の引数を返すだけの場合は、COALESCEを使用します。ジョインは、違いが空の場合、湖を返しません。この動作を変更すると、多くのコードが破損します。この動作に依存している人々は、引数の順序などについて心配する必要があるためです。例:COALESCE(ST_Difference ...、river.geom、the_world); COALESCEを使用すると、無制限の数の引数を適用でき、データベースプログラマーがNULLを処理する標準的な方法です。
LR1234567

はい、あなたは正しいです、もちろん:-)以前にそれについて考えたことがないので、一致がない場合、結合は空ではなく未定義の値を返す必要があります。
NicklasAvén、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.