2016-05-03 14 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,但我不确定。