PostGIS st_point functoin возвращает нулевые значения для всех записей, которые не соответствуют критериям - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь создать значения geom для новых записей, поступающих с полевых устройств, имеющих значения широты и долготы в двух полях (широта, долгота), для данного проекта с использованием следующего выражения:

UPDATE public.data_mds_import

SET geom=(

SELECT 

    st_force3d(st_setsrid(st_point(public.data_mds_import.longitude, public.data_mds_import.latitude),4326))

WHERE PUBLIC.data_mds_import.id_jobcode=220 /* ENTER ID_JOBCODE HERE */

    );

У нас много поступающих полевых данных, и мне нужен оператор, в котором я могу просто изменить значение кода задания в выражении для каждого нового набора данных поля, который импортируется.

Проблема заключается в том, что для других заданий в В таблице, где jobcode! = 220, функция возвращает нулевые значения, т. е. удаляет значение geom, я теряю свои данные геометрии, поэтому я go имею несколько тысяч записей со значением геометрии до запуска функции, и только записи, где код задания = '220'.

Почему это происходит, оператор должен выбирать только записи, где код задания = 220, верно? Принимая во внимание, что он выбирает все записи и возвращает геометрию, где jobcode = 220, и ноль для каждой другой записи. Никакое действие не будет лучше, чем ноль.

Должен ли я использовать оператор case? Если это так, может кто-то, пожалуйста, помогите с таким утверждением, я попробовал несколько вариантов оператора case и не могу получить оператор для выполнения.

1 Ответ

1 голос
/ 30 января 2020

Добро пожаловать на SO.

Если вы обновляете одну таблицу, нет необходимости использовать запрос для простого обновления столбца. Кроме того, вам не нужно повторять имена схем и таблиц.

Этот запрос выбирает все записи, которые соответствуют id_jobcode = 220, и создает геометрию в столбце geom из значений latitude и logitude:

UPDATE public.data_mds_import
SET geom = ST_Force3D(
             ST_SetSRID(
               ST_Point(longitude, latitude),4326))
WHERE id_jobcode = 220;
...