SQL:如何替换冲突类型联合中的值

SQL: How to replace values in a union of conflicting types

我在 Postgres(使用 PostGIS)中有一个 table,其中有几千行,每行都有名称(文本)、代码(文本)、城市(文本)和几何(几何) ) 统计区域单位(如县)。几何形状完美镶嵌。

我正在尝试编写一个查询,该查询将 select 满足某些条件的所有行,并将其余行聚合成一行。对于那一行,我对名称和代码不感兴趣,只对聚合的 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';

这似乎是一种非常迂回和不明确的完成非常简单的事情的方法。有更好的方法吗?

您可以硬编码您希望这些单元格填充的内容。我相信在 postgres 中你可以用 ticks 来做到这一点:

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,则可以这样做。我觉得没必要。

我不知道这是否适用于 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 是一个聚合函数,如果它聚合在一行上,那么它应该只是 return 那一行的几何形状。如果有必要,您可以将其包含在 ST_Force2d 中,但我不确定是否如此。