【问题标题】:SQL: How to replace values in a union of conflicting typesSQL:如何替换冲突类型联合中的值
【发布时间】:2016-08-29 01:23:39
【问题描述】:

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

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

这似乎是一种非常迂回且不清楚的方式来完成非常简单的事情。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案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,则可以改为这样做。对我来说似乎没有必要。

    【讨论】:

      【解决方案2】:

      我不知道这是否适用于 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 中,但我不确定是否如此。

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 2013-08-04
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多