我從受此SO post啟發UNION ALL的表名串列(下面稱為表)中開發了一個表函式。tablelist
初始函式只回傳一個選擇,但現在我想撰寫一個新表,其名稱取自引數new_table_name。
我正在努力將引數插入DROP TABLEANDCREATE TABLE陳述句的語法。這是回傳的嘗試之一ERROR: mismatched parentheses at or near ";"
DROP FUNCTION IF EXISTS f_multi_union(text);
CREATE OR REPLACE FUNCTION f_multi_union(new_tab_name text)
RETURNS Table (my_id int, metric double precision, geom geometry)
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY EXECUTE
(
DROP TABLE IF EXISTS working.'' || new_tab_name || '';
CREATE TABLE working.'' || new_tab_name || '' AS (
SELECT string_agg(format('SELECT * FROM %s', tbl), ' UNION ALL ')
FROM (SELECT tbl FROM working.tablelist) sub
)
);
END
$func$;
uj5u.com熱心網友回復:
像這樣的東西?
DROP FUNCTION IF EXISTS f_multi_union(text);
CREATE OR REPLACE FUNCTION f_multi_union(new_tab_name text)
RETURNS void -- nothing to return
LANGUAGE plpgsql AS
$func$
DECLARE
_sql TEXT;
BEGIN
_sql := format('DROP TABLE IF EXISTS working.%I;', new_tab_name); -- avoid SQL injection
EXECUTE _sql;
_sql := 'SELECT string_agg(format(''SELECT * FROM %I'', tbl), '' UNION ALL '')
FROM (SELECT tbl FROM working.tablelist) sub;';
EXECUTE _sql
INTO _sql; -- overwrite current _sql content
_sql := format('CREATE TABLE working.%I AS %s;', new_tab_name, _sql);
EXECUTE _sql;
END
$func$;
我會將 SELECT 陳述句中的 * 替換為您需要的列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/497547.html
標籤:sql PostgreSQL
上一篇:為什么“=”在where子句中,不匹配精確的字串(包括空格和特殊字符)?
下一篇:客戶端后端VS后臺撰寫器
