【问题标题】:PostGIS st_point functoin returns null values for all records that do not meet criteriaPostGIS st_point 函数为所有不符合条件的记录返回空值
【发布时间】:2020-01-30 09:55:46
【问题描述】:

我正在尝试使用以下表达式为给定项目创建来自在两个字段(纬度、经度)中具有纬度和经度值的现场设备的新记录的 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 值,我丢失了我的几何数据,所以我之前有几千条带有几何值的记录函数运行,只运行到 jobcode = '220' 的记录。

为什么会发生这种情况,语句应该只选择 jobcode=220 的记录对吗?而它似乎选择了所有记录并返回 jobcode = 220 的几何图形,并且对于所有其他记录返回 null。没有什么比 null 更好的了。

我应该使用案例陈述吗?如果是这样,有人可以帮忙处理这样的声明,我尝试了几种案例声明变体,但无法执行声明。

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    欢迎来到 SO。

    如果您要更新单个表,则无需使用 suquery 来简单地更新列。此外,您不需要重复架构和表名。

    此查询选择与id_jobcode = 220 对应的所有记录,并根据latitudelogitude 的值在geom 列中创建一个几何:

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

    【讨论】:

    • 嗨,吉姆,感谢您的回复。因此,您的代码和我的代码之间的唯一区别是我无意中使用了子查询?这本身会导致所描述的问题吗?即“Set”函数返回子查询(id_jobcode = 200)记录集的几何图形,因此所有其他记录都返回 Null?子查询本身不应该排除所有工作代码!= 220 不管是什么情况,我都测试过它并且它有效,如此简单,愚蠢的错误,非常感谢。
    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多