You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在PostGIS中筛选含Point几何类型的表?能否用SQL实现?

当然可以!在PostGIS里完全能用SQL查询出所有包含Point几何类型的表,分两种常见场景给你具体方案:

1. 查询几何列定义为Point类型的表

如果你的表的几何列是明确声明为POINT类型(而非通用的GEOMETRY类型),直接查询geometry_columns视图就能搞定——这个视图本身就存储了所有空间列的元数据:

SELECT DISTINCT
  f_table_schema AS schema_name,
  f_table_name AS table_name
FROM geometry_columns
WHERE type = 'POINT';

这里用DISTINCT是为了避免同一个表因为有多个Point列而被重复返回,结果会清晰给出模式名和表名。

2. 查询几何列是通用GEOMETRY类型但实际包含Point数据的表

如果你的几何列定义的是通用GEOMETRY,但里面混合了Point、LineString等多种类型,想要找出那些至少有一条Point记录的表,就需要检查实际数据了。这种情况可以写个简单的PL/pgSQL函数来实现:

CREATE OR REPLACE FUNCTION find_tables_with_point_geoms()
RETURNS TABLE(schema_name text, table_name text) AS $$
DECLARE
  rec record;
BEGIN
  FOR rec IN
    SELECT f_table_schema, f_table_name, f_geometry_column
    FROM geometry_columns
  LOOP
    EXECUTE format(
      'SELECT 1 FROM %I.%I WHERE ST_GeometryType(%I) = ''ST_Point'' LIMIT 1',
      rec.f_table_schema, rec.f_table_name, rec.f_geometry_column
    );
    IF FOUND THEN
      schema_name := rec.f_table_schema;
      table_name := rec.f_table_name;
      RETURN NEXT;
    END IF;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

调用这个函数就能得到结果:

SELECT DISTINCT * FROM find_tables_with_point_geoms();

这个函数会遍历所有空间表,检查每个几何列是否存在Point类型的记录,找到后就返回对应的表信息,DISTINCT同样是为了避免重复返回同一个表。

需要注意的是,第二种方法需要扫描表数据,如果你有大量数据的话可能会慢一点,所以优先用第一种方法,除非你确实需要处理混合类型的几何列。

内容的提问来源于stack exchange,提问作者barteloma

火山引擎 最新活动