SQL:如何替换冲突类型联合中的值
我在Postgres和PostGIS中有一个表,其中有几千行,每行都有nametext、codetext、citytext和一个统计区域单位(如县)的几何图形。这些几何图形镶嵌得非常完美 我正在尝试编写一个查询,该查询将选择满足某些条件的所有行,并将其余行聚合到一行中。对于这一行,我对名称和代码不感兴趣,只对聚合的geom感兴趣。例如,类似这样的事情:SQL:如何替换冲突类型联合中的值,sql,postgresql,postgis,Sql,Postgresql,Postgis,我在Postgres和PostGIS中有一个表,其中有几千行,每行都有nametext、codetext、citytext和一个统计区域单位(如县)的几何图形。这些几何图形镶嵌得非常完美 我正在尝试编写一个查询,该查询将选择满足某些条件的所有行,并将其余行聚合到一行中。对于这一行,我对名称和代码不感兴趣,只对聚合的geom感兴趣。例如,类似这样的事情: code | name | 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
我曾经想到过以下几点:
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';
这似乎是一个非常迂回和不明确的方式来完成一些相当简单的事情。有更好的方法吗?您可以硬编码希望这些单元格填充的内容。我相信在博士后,你可以用蜱来做这件事:
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替换它们。如果您希望在这种情况下看到Xs,您可以这样做。对我来说似乎没有必要。我不知道这是否适用于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里,但我不确定它是不是