首页 > 解决方案 > 根据参数动态选择模式和表

问题描述

我有一组存储不同国家邮政编码的表格。一个国家/地区的每个表(称为 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)中进行查询。

谢谢您的帮助!

标签: sqlpostgresqlpostgresql-9.6

解决方案


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

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$;

推荐阅读