Postgresql
跨多個模式查詢,直到執行時才知道
我有多個需要查詢的模式。這些模式是事先不知道的,例如:
- U111
- U222
- U333
我需要從每個模式中的特定表中選擇這三個模式。我可以將此查詢放在這三個模式中嗎?如果是這樣,我該如何查詢它們?請記住,我不會提前知道模式名稱,因此需要動態建構它們。
如果您只需要來自多個模式的結果,您可以重複使用相同的查詢字元串並
search_path
在兩者之間設置:SET search_path = u111, public; SELECT * FROM foo; SET search_path = u222, public; SELECT * FROM foo; ...
Postgres 中的模式搜尋路徑
search_path
很像文件系統的搜尋路徑。有關的:如果您需要組合來自多個模式的結果(可能是您的案例),您可以在客戶端中建構語句或使用plpgsql 函式與動態 SQL 和
EXECUTE
. 這就是我會做的。普通 SQL 不允許參數化標識符(模式、表、列……)。CREATE OR REPLACE FUNCTION foo(_schemas text[]) RETURNS TABLE (bar int, baz text) AS -- matching return type $func$ BEGIN RETURN QUERY EXECUTE ( SELECT string_agg(format('SELECT bar, baz FROM %I.foo', sch) -- your query here , E'\nUNION ALL\n') FROM unnest(_schemas) sch ); END $func$ LANGUAGE plpgsql;
動態建構並執行以下形式的查詢:
SELECT bar, baz FROM u111.foo UNION ALL SELECT bar, baz FROM u222.foo UNION ALL SELECT bar, baz FROM u333.foo;
Schema 名稱被正確地轉義為標識符,以防止 SQL 注入。
db<>fiddle here(返回查詢字元串作為錯誤消息而不是執行它)
如果您的表結構相同,您可以使用表繼承,然後創建一個包含所有表結構的主模式,並讓其他表結構從該表結構繼承表:這是我們寫的一篇描述該技術的文章:
http://www.postgresonline.com/journal/archives/59-How-to-Inherit,-Unherit-and-Merge-Inherit.html