[英]Dynamic UNION ALL query in Postgres
我們正在使用Postgres / PostGis連接來獲取通過地理服務器發布的數據。
目前查詢看起來像這樣:
SELECT
row_number() over (ORDER BY a.ogc_fid) AS qid, a.wkb_geometry AS geometry
FROM
(
SELECT * FROM test
UNION ALL
SELECT * FROM test1
UNION ALL
SELECT * FROM test2
)a
在我們的數據庫中,僅將有效的shapefile導入到單個表中,因此使UNION ALL零件動態化(遍歷每個表並執行UNION ALL語句)是有意義的。 有沒有一種方法可以以標准的Postgres方式執行此操作,或者我需要編寫一個函數,語法看起來如何? 我對SQL很陌生。
shapefile具有不同的數據結構,並且只有ogc_fid列和wkb_geometry列始終可用,我們希望從數據庫中合並所有表。
這只是一般性准則,您需要在細節(特別是語法)方面進行工作。
您需要創建一個存儲過程
創建一個循環,檢查所需information_schema.tables
的表名的information_schema.tables
過濾器
DECLARE
rec record;
strSQL text;
BEGIN
然后為每個表創建一個strSQL
FOR rec IN SELECT table_schema, table_name
FROM information_schema.tables
LOOP
strSQL := strSQL || 'SELECT ogc_fid, wkb_geometry FROM ' ||
rec.table_schema || '.' || rec.table_name || ' UNION ';
END LOOP;
-- have to remove the last ' UNION ' from strSQL
strSQL := 'SELECT row_number() over (ORDER BY a.ogc_fid) AS qid,
a.wkb_geometry AS geometry FROM (' || strSQL || ')';
EXECUTE strSQL;
一種解決方案是使用row_to_json()將其余的列序列化為json 。 (自PostgreSQL9.2起可用)。 對於PG9.1(及更低版本),您可以使用hstore ,但請注意,所有值都強制轉換為文本。
為什么要序列化? 這是不可能的工會行,其中柱的側向承載力的數量而變化,或數據類型不工會查詢之間的匹配。
我創建了一個簡單的示例來說明:
--DROP SCHEMA testschema CASCADE;
CREATE SCHEMA testschema;
CREATE TABLE testschema.test1 (
id integer,
fid integer,
metadata text
);
CREATE TABLE testschema.test2 (
id integer,
fid integer,
city text,
count integer
);
CREATE TABLE testschema.test3 (
id integer,
fid integer
);
INSERT INTO testschema.test1 VALUES (1, 4450, 'lala');
INSERT INTO testschema.test2 VALUES (33, 6682, 'London', 12345);
INSERT INTO testschema.test3 VALUES (185, 8991);
SELECT
row_number() OVER (ORDER BY a.fid) AS qid, a.*
FROM
(
SELECT id, fid, row_to_json(t.*) AS jsondoc FROM testschema.test1 t
UNION ALL
SELECT id, fid, row_to_json(t.*) AS jsondoc FROM testschema.test2 t
UNION ALL
SELECT id, fid, row_to_json(t.*) AS jsondoc FROM testschema.test3 t
) a
SELECT輸出:
qid id fid jsondoc
1; 1; 4450; "{"id":1,"fid":4450,"metadata":"lala"}"
2; 33; 6682; "{"id":33,"fid":6682,"city":"London","count":12345}"
3; 185; 8991; "{"id":185,"fid":8991}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.