Postgresql
添加一個名稱為 SELECT 的結果的列
我在我的項目中使用 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$ ;