Postgresql

添加一個名稱為 SELECT 的結果的列

  • April 1, 2021

我在我的項目中使用 PostgreSQL,並且我有一個 Spring Boot 應用程序,它使用 Flyway 在我的數據庫上創建所有內容。我需要創建一個列,其類型基於其他表的一行。例如:

ALTER TABLE NAMES ADD COLUMN (SELECT n.name FROM NAMES AS n WHERE n.name = 'Tom') VARCHAR(255) NULL;

這可能嗎?我可以創建一個函式來完成選擇工作,然後在 Alter Table 程式碼中呼叫它嗎?

上下文:如果你想知道我為什麼需要這個,我有很多使用幾何類型的客戶,每個客戶都有不同的 EPSG,我需要根據客戶的幾何創建“geom”列,所以我想做一個根據我的客戶名稱進行選擇以獲取其幾何類型,然後創建具有該類型的列。

編輯:

我想我得到了一些接近我需要的東西:

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

使用以下功能解決了我的問題:

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$
;

引用自:https://dba.stackexchange.com/questions/289105