postgresql - 尝试在 PgAdmin4 中使用 ST_CONTAINS 对列进行 FOR LOOP
问题描述
我正在使用 PgAdmin4 创建一个包含大量几何数据的视图。该数据的一部分是存在于多边形中的折线。我正在尝试编写一个代码,该代码可以遍历给定列中的所有折线数据,并检查它是否在给定的多边形中,并返回真/假。到目前为止,这就是我所拥有的。
DO
$$
BEGIN
FOR i IN (SELECT "geom" FROM "street map"."segment_id")
LOOP
SELECT ST_CONTAINS(
(SELECT "geom" FROM "street map"."cc_districts" WHERE "district number" = 1),
(i)
)
RETURN NEXT i
END LOOP;
END
$$
运行此代码时收到的错误如下:
ERROR: loop variable of loop over rows must be a record or row variable or list of scalar variables
LINE 4: FOR i IN (SELECT "geom" FROM "street map"."segment_id")
^
SQL state: 42601
Character: 18
据我了解,“i”必须指“行变量”,我试图用这段代码定义该变量:
(SELECT "geom" FROM "street map"."segment_id")
任何实现这一目标的想法都会非常有帮助。
解决方案
一个简单的连接在这里会更有效
SELECT line.*, polygon.id IS NOT NULL AS is_in_polygon
FROM line
LEFT JOIN polygon
ON ST_Contains(polygon.geometry, line.geometry)
AND polygon.id = 1
可以翻译为:
获取line
记录的每个字段,true
如果polygon.id
存在(is not null
),false
否则(更多下文)。将此布尔字段命名为is_in_polygon
。
在每一行上都这样做。
将每条线加入(链接)到多边形层。如果没有匹配,请保留line
信息并NULL
为每个polygon
字段放置(这是 a left join
)。如果有匹配项,请同时保留line
和polygon
信息。
如果polygon.geometry
包含line.geometry
并且如果polygon.id = 1
推荐阅读
- cmake - 使用emscripten时如何解析freetype头文件
- r - 着色 Rgl 3d 网格面
- haskell - 为异构操作创建类型类的问题
- react-native - 在顶部获取重复的导航选项
- c - FreeRTOS 应用程序堆栈可用内存随时间减少
- java - Spring Data Rest 帖子无法保存嵌套对象
- php - 从具有关联文本框的多个复选框中捕获表单数据
- c++ - 将自身转换为派生类后可以访问c++基本私有方法吗?
- plugins - LinkedIn 个人资料插件不加载徽标 #linkedin
- react-native - React-Native-Video 如何添加 onPress?