ST_Intersect以double结果返回

时间:2017-05-29 02:31:50

标签: postgresql postgis

我正在尝试将case语句写入使用Postgres的区域中的交叉点,如下所示:

SELECT Point.id, Point.geom, Box.Postcode,
CASE
    WHEN ST_Intersects(Box.geom, Point.geom) AND Box.postcode = 'A' THEN 'A'
    WHEN ST_Intersects(Box.geom, Point.geom) AND Box.postcode = 'B' THEN 'B'
    WHEN ST_Intersects(Box.geom, Point.geom) AND Box.postcode = 'C' THEN 'C'
    ELSE 'No postcode'
END AS PointPostcode

这个想法是,位于Box内的每个Point都有一个名为'PointPostCode'的新属性列,并且有邮政编码信息:'A','B','C'取决于它们的位置。而对于位于框外的点,将有“无邮政编码”信息。

我成功运行了这些查询,我也按照自己的意愿获得了新列。 Box内部的点也正确地具有邮政编码信息,但同时也为所有点提供了“无邮政编码”标签(重新加倍值)。

有人可以帮我弄明白我的查询错误在哪里吗?

2 个答案:

答案 0 :(得分:0)

我相信您要执行以下查询:

SELECT Point.id, Point.geom, Box.Postcode,
CASE
    WHEN Box.postcode = 'A' THEN 'A'
    WHEN Box.postcode = 'B' THEN 'B'
    WHEN Box.postcode = 'C' THEN 'C'
    ELSE 'No postcode'
END AS PointPostcode
WHERE ST_Intersects(Box.geom, Point.geom)

答案 1 :(得分:0)

您可能想了解一下查询语法,标识符名称和JOINS;例如

  • 您没有指定关系(FROM)及其连接条件;您可能想要LEFT JOIN,否则您的CASE毫无意义,因为不会选择任何box.geom之外的行

  • PG未明确包装在lower_case中时使用"标识符名称;即BoxPostcode = boxpostcode = BoXpOsTcOdE(如果使用'特殊'字符创建了列 ,则该列也是"BoxPostcode" != BoxPostcode


考虑到这一点,使用COALESCE是一种更为通用和高效的方式:

SELECT p.id,
       p."Postcode",
       COALESCE(b."Postcode", 'No postcode') AS "BoxPostcode",
       p.geom
FROM   "Point" AS p
LEFT JOIN
       "Box" AS b
ON     ST_Intersects(b.geom, p.geom)
;