2013-06-27 135 views
2

我在數據庫中有很少的表。它們都具有相同的列(id,name),但表名不同。這些表的名稱以字母'h'開頭。
不是一個非常有趣的模式設計,但我必須遵循它。
我需要在所有這些表中搜索id。查詢獲取表名的子查詢

我想類似的東西:

select id from (select table_name 
FROM information_schema.tables 
where table_name like 'h%') as t; 

我得到錯誤:

ERROR: column "id" does not exist. 

我現在明白了錯誤,但我還是不知道該怎麼做的查詢?

回答

3

您需要動態SQL才能這樣做,因爲您無法將值用作普通SQL中的標識符。寫一個PL/pgSQL函數與EXECUTE

CREATE FUNCTION f_all_tables() 
    RETURNS TABLE (id int) AS 
$func$ 
DECLARE 
    _tbl regclass; 
BEGIN 

FOR _tbl IN 
    SELECT c.oid::regclass 
    FROM pg_catalog.pg_class c 
    JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
    WHERE c.relkind = 'r' 
    AND c.relname LIKE 'h%' 
    AND n.nspname = 'public' -- your schema name here 
LOOP 
    RETURN QUERY EXECUTE ' 
    SELECT id FROM ' || _tbl; 
END LOOP; 

END 
$func$ LANGUAGE plpgsql; 

我使用的對象標識符類型regclass的可變有效防止SQL注入。更多關於在這個相關的答案:
Table name as a PostgreSQL function parameter

+0

謝謝@Erwin Brandstetter – sweety

+0

@sweety:請注意固定的拼寫錯誤。 –