如何在PostgreSQL数据库的多数据集里查找geom列值为NULL的记录?
遍历PostgreSQL中含geom列的表并查找geom为NULL的记录
方法1:生成动态查询语句批量执行
你可以通过拼接SQL语句的方式,一次性生成针对所有目标表的查询,再执行得到结果:
-- 生成所有目标表的查询语句 SELECT string_agg( format( 'SELECT ''%I'' AS source_table, * FROM %I.%I WHERE geom IS NULL', c.table_name, c.table_schema, c.table_name ), ' UNION ALL ' ) AS combined_query FROM information_schema.columns c WHERE c.column_name = 'geom';
执行这条语句后,会得到一个由UNION ALL连接的完整SQL。把生成的combined_query字段内容复制出来直接执行,就能一次性获取所有表中geom为NULL的记录,每条结果都会标注来源表名。
方法2:用PL/pgSQL自动遍历执行
如果表数量较多,手动复制执行麻烦,可使用PL/pgSQL脚本自动遍历并输出结果:
DO $$ DECLARE tbl_record record; null_record record; BEGIN -- 遍历所有包含geom列的表 FOR tbl_record IN SELECT table_schema, table_name FROM information_schema.columns WHERE column_name = 'geom' LOOP -- 查询当前表中geom为NULL的记录并输出 FOR null_record IN EXECUTE format( 'SELECT ''%I.%I'' AS source_table, * FROM %I.%I WHERE geom IS NULL', tbl_record.table_schema, tbl_record.table_name, tbl_record.table_schema, tbl_record.table_name ) LOOP RAISE NOTICE '%', null_record; END LOOP; END LOOP; END $$;
运行这个脚本后,控制台会输出所有符合条件的记录,每条记录都会带上完整的表名(模式+表名)和行数据。
关键提示
- 两个方法都包含了
table_schema(模式),避免不同模式下同名表的混淆,如果你所有表都在public模式下,可以去掉table_schema相关参数,但保留的话兼容性更强。 - 如果某个表的
geom列没有NULL值,对应的子查询会返回空,不会影响整体结果。
内容的提问来源于stack exchange,提问作者Goldcrest
相关产品推荐
相关产品推荐

