2016-05-03 16 views
3

私は数千の行があり、それぞれ名前(テキスト)、コード(テキスト)、都市(列)がある単一のテーブルをPostgresテキスト)とgeom(ジオメトリ)の統計領域単位(郡のような)。ジオメトリは完全にテッセレーションします。SQL:競合する型の和集合の値を置き換える方法

私はいくつかの条件を満たすすべての行を選択し、残りの行を1つの行に集約する単一のクエリを作成しようとしています。その1行では、名前とコードには関心がありません。集計されたgeomだけです。例えば、このような何か:

code | name    | geom 
------+--------------------+--------- 
102 | Central Coast  | geo... 
115 | Sydney - Baulkham | geo... 
116 | Sydney - Blacktown | geo... 
117 | Sydney - City  | geo... 
118 | Sydney - Eastern | geo... 
000 | Remaining Counties | geo... <---Second SELECT just to get this row 

は、私は、次を思い付くthis answerを使用:

SELECT code, name, ST_Force2D(geom) FROM mytable WHERE mytable.city = 'Greater Sydney' UNION 
SELECT 
    CASE WHEN count(code) > 0 THEN '0' ELSE 'x' END AS code, 
    CASE WHEN count(name) > 0 THEN 'Rest of Sydney' ELSE 'x' END AS name, 
    ST_Collect(geom) 
FROM mytable WHERE mytable.city <> 'Greater Sydney'; 

これは非常に単純な何かを達成するのは本当に遠回りと不明瞭な方法のように思えます。これを行うより良い方法はありますか?

答えて

1

これらのセルに入力する内容をハードコードすることができます。私はあなたがティックでこれを行うpostgresのを信じて:

SELECT code, name, ST_Force2D(geom) 
FROM mytable 
WHERE mytable.city = 'Greater Sydney' 

UNION 

SELECT '0', 'Remaining Countries', ST_Collect(geom) 
FROM mytable 
WHERE mytable.city <> 'Greater Sydney'; 

あなたが見つかった答えは、あなたがそのような場合にはXを確認したい場合は、あなたの代わりにそのように行うことができますゼロ値を補償し、X.に置き換えます。私には不必要だと思われる。

0

私は年間でそれに働いていないとのPostGISを使用したことがないので、これはPostgreSQLで動作するかどうかはわからないが、あなたが試みることができる:ST_Collect以来

SELECT 
    CASE WHEN city = 'Greater Sydney' THEN code ELSE '000' END AS code, 
    CASE WHEN city = 'Greater Sydney' THEN name ELSE 'Remaining Counties' END AS name, 
    ST_Collect(geom) AS geom 
FROM 
    MyTable 
GROUP BY 
    CASE WHEN city = 'Greater Sydney' THEN code ELSE '000' END, 
    CASE WHEN city = 'Greater Sydney' THEN name ELSE 'Remaining Counties' END 

があれば、集約関数でありますそれは単一行に集約されますが、それはちょうどその行のジオメトリを返します。もしそれが必要ならば、あなたはST_Force2dにそれを囲むことができますが、私は確信していません。

関連する問題