postgresql - 使用 information_schema 中的表和列执行查询

标签 postgresql

我正在尝试使用 information_schema.columns 查找数据库中所有具有几何类型的列,然后检查这些列中数据的 SRID。

我可以通过多个查询来做到这一点,首先找到表名和列名

SELECT table_name, column_name
FROM information_schema.columns
WHERE udt_name = 'geometry';

然后(手动)

SELECT ST_SRID(column_name)
FROM table_name;

对于每个条目。

有人知道如何将其简化为单个查询吗?

最佳答案

表名不能可变; Postgres 需要能够在知道参数值之前提出一个执行计划。所以您不能在简单的 SQL 语句中执行此操作。

相反,您需要使用过程化语言(如 PL/pgSQL)构建动态查询字符串:

CREATE FUNCTION SRIDs() RETURNS TABLE (
  tablename TEXT,
  columnname TEXT,
  srid INTEGER
) AS $$
BEGIN
  FOR tablename, columnname IN (
    SELECT table_name, column_name
    FROM information_schema.columns
    WHERE udt_name = 'geometry'
  )
  LOOP
    EXECUTE format(
      'SELECT ST_SRID(%s) FROM %s',
      columnname, tablename
    ) INTO srid;
    RETURN NEXT;
  END LOOP;
END
$$
LANGUAGE plpgsql;

SELECT * FROM SRIDs();

关于postgresql - 使用 information_schema 中的表和列执行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434655/

相关文章:

ruby - 如何在 Sequel 迁移中创建 hstore 列?

php - 503 Service Unavailable after brew install 并重启apache2

sql - 缺少日期的 PostgreSQL 聚合

sql - PostGIS:在多边形中选择点的函数

sql - Postgres 查询包含某些内容的 JSON 数组

sql - 如何使用 group by 子句从每个用户的两个子查询的结果集中获取 max( latest_modified_time) 记录?

sql - PostgreSQL 根据数组值的组合选择行

postgresql - 删除表时保留从 BIGSERIAL 创建的序列

PostgresQL Windows 安装程序 - 空白屏幕 -

postgresql - 如何使用命令行参数在后续提示中提供输入(批处理文件)