2016-05-03 15 views
3

我在Postgres(帶PostGIS)中有一個表,其中有幾千行,每行都有名稱(文本),代碼(文本),城市(文本)和統計區域單位(如縣)的幾何(幾何)。幾何圖形鑲嵌完美。SQL:如何替換衝突類型聯合中的值

我試圖寫一個單一的查詢,將選擇符合某些條件的所有行,並將其餘的集合到一行中。對於那一行,我對名字和代碼不感興趣,只是聚合的幾何。例如,像這樣:

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在這種情況下的答案,你可以做到這一點,而不是這樣的。對我來說似乎沒有必要。

0

我不知道這是否會在PostgreSQL的工作,因爲我已經很多年沒有與它的工作,從來沒有使用PostGIS的,但你可以嘗試:

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_Collect是一個聚合函數,如果它聚合在一行上,那麼它應該只是返回那一行的幾何圖形。如果有必要的話,你可以附上ST_Force2d,但我不確定。