首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SELECT中添加一个具有名称的列

从SELECT中添加一个具有名称的列
EN

Database Administration用户
提问于 2021-04-01 15:09:27
回答 2查看 261关注 0票数 0

我在我的项目中使用PostgreSQL,我有一个Spring应用程序,它使用Flyway来创建我的数据库上的所有内容。我需要创建一个列,它的类型是基于另一个表上的一行。例如:

代码语言:javascript
复制
ALTER TABLE NAMES ADD COLUMN (SELECT n.name FROM NAMES AS n WHERE n.name = 'Tom') VARCHAR(255) NULL;

这个是可能的吗?我可以创建一个函数来完成选择工作,然后在Alter代码中调用它吗?

上下文:如果您想知道我为什么需要这个,我有很多客户端使用几何学类型,而且每个客户端都有不同的EPSG,我需要基于客户机的几何学创建"geom“列,所以我想根据我的客户端的名称进行选择,得到它的几何学类型,然后创建带有该类型的列。

编辑:

我想我找到了我需要的东西:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION client_schema.update_geom(my_table text, my_schema text, OUT alter_result boolean)
    LANGUAGE plpgsql
    AS $function$
    declare client_projection varchar(255);
    declare db_name varchar(255);
    begin
        CREATE extension if not EXISTS dblink;
        select split_part(current_database(), '-', 1) into db_name;
        select c.projection_key from client_schema.dblink('dbname=adm-3','SELECT projection_key, context_name FROM "adm-3".public.clients as c ')
        AS c(projection_key text, context_name text) where c.context_name = db_name into client_projection;
        EXECUTE 'ALTER TABLE '
            || esquema::text || '.' || tabela::text 
            || ' ALTER COLUMN geom type geometry(Polygon, split_part($1, '':'', 2))'
            INTO alter_result
            USING client_projection;
        END;
    $function$
;

现在的问题是他不让我更新列的类型!错误:SQL Error [42601]: ERROR: type modifiers must be simple constants or identifiers

EN

回答 2

Database Administration用户

回答已采纳

发布于 2021-04-01 19:59:37

用以下功能解决了我的问题:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION client_schema.update_geometry_type(my_table text, my_schema text, OUT update_result boolean)
LANGUAGE plpgsql
AS $function$
   declare new_projection varchar(255);
   declare my_database varchar(255);
   declare old_projection varchar(255);
   begin
   CREATE extension if not EXISTS dblink;
   select split_part(current_database(), '-', 1) into my_database;
   select c.projection_key from client_schema.dblink('dbname=adm-3','SELECT projection_key, client_name FROM "adm-3".public.client as c ')
   AS c(projection_key text, client_name text) where c.client_name = my_database into new_projection;
   select Find_SRID(my_schema, my_table, 'geom') into old_projection ;
   select split_part(new_projection , ':', 2) into new_projection;
   EXECUTE 'ALTER TABLE '
   || my_schema::text || '.' || my_table::text 
   || ' ALTER COLUMN geom type geometry(Polygon, ' || new_projection ||') USING ST_Transform(geom, ''EPSG:' || old_projection || ''', ' || new_projection || ')';
   END;
$function$
;
票数 1
EN

Database Administration用户

发布于 2021-04-01 21:37:26

您可以使用生成create table语句的SQL。它能产生插入物什么的。这样,您就可以在不同的DB系统之间移动数据,等等。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/289105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档