根据参数动态选择架构和表

时间:2018-12-12 17:59:48

标签: sql postgresql postgresql-9.6

我有一组表,它们存储不同国家的邮政编码。一个国家/地区的每个表格(称为postal_codes)都位于不同的架构中,例如:zone_us,zone_uk,zone_fr等。我在公共架构中有一个表格,其中存储了所有邮政编码的ID和国家/地区代码(例如,英国,法国,...)。查询邮政编码ID(public.postal_codes)时,查询还必须在链接到原籍国的架构内返回其邮政编码记录。

例如:

表public.postal_codes

id  country  zone_code_id
1   us       2
2   uk       4
3   uk       2
4   fr       9

表zone_us.postal_codes

id   code      address
2    3454355   Example Street X

表zone_uk.postal_codes

id   code      address
2    9845654   Example Street X
4    7845654   Example Street Z

表zone_fr.postal_codes

id   code      address
9    9456546   Example Street X

查询应检查是否存在该区域的表(zone_ [country_code] .postal_codes),如果是,则返回相应的行,如果没有,则在默认区域(zone_default.postal_codes)中进行查询。 / p>

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我创建了一个函数来解决我的问题,但是我不知道这是否是最有效的方法。如果有人有更好的建议。

CREATE OR REPLACE FUNCTION public.get_zone_postal_code("country_code" VARCHAR, "code_id" INT4) RETURNS SETOF RECORD
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
   schema_name varchar := 'zone_br';
BEGIN 
    IF EXISTS(SELECT 1 FROM information_schema.tables WHERE  table_schema = 'zone_' || country_code and table_name = 'postal_codes') THEN
        schema_name := 'zone_' || country_code;
    END IF;
    RETURN QUERY EXECUTE FORMAT('SELECT code FROM %I.postal_codes WHERE id = %s', schema_name, code_id);
END 
$BODY$;