sql - 根据参数动态选择模式和表
问题描述
我有一组存储不同国家邮政编码的表格。一个国家/地区的每个表(称为 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)中进行查询。
谢谢您的帮助!
解决方案
我创建了一个函数来解决我的问题,但我不知道这是否是最有效的方法。如果有人有更好的建议。
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$;
推荐阅读
- dataframe - 如何在pyspark中将字符串日期转换为时间戳?
- json - 如何在 Julia 中将多个 JSON 文件加载到单个 DataFrame 中?
- python - 为什么队列大小保持为零?
- matlab - Matlab如何将向量中的一系列数字显示为字符串?
- html - 使用 jquery 完成淡入淡出后替换 HTML
- mongodb - 错误:(InvalidBSON)在具有 _id 的对象中字段名称为“clone_class_metrics.CE”的元素中的 BSON 长度不正确:ObjectId
- ui-automation - IE11 中 IBM Sterling OMS 应用程序的少数元素禁用了检查元素。尝试使用 IE 开发工具进行对焦,但无法定位
- android - React-Native Run-Android 无法识别 Open Metro Server
- c++ - vs2019 C++模板函数trait问题如何解决?
- javascript - React Native apk 在物理设备上显示空白,但在 Android 模拟器上不显示