Я пытаюсь написать заявление 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

Идея состоит в том, что каждая точка, которая находится внутри бокса, будет иметь новый столбец атрибута с именем «PointPostCode» и иметь информацию о почтовых индексах: «A», «B», «C» зависит от их местоположения. А для точки, расположенной за пределами коробки, будет информация «Нет почтового индекса».

Я успешно запустил эти запросы, я также получил новый столбец как то, что я хочу. Точки, расположенные внутри бокса, также имеют правильную информацию о почтовом индексе, но в то же время ей также присваивается метка «Нет почтового индекса» для всех точек (удвоить значение).

Может ли кто-нибудь помочь мне понять, в чем ошибка моего запроса?

0
reyalino 29 Май 2017 в 05:31

2 ответа

Лучший ответ

Я считаю, что вы хотите выполнить следующий запрос:

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)
0
rdo 29 Май 2017 в 02:36

Возможно, вы захотите прочесть синтаксис запроса, имена идентификаторов и 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)
;
0
geozelot 8 Окт 2019 в 07:15