1、需求:
-- 协议主题表 DROP TABLE IF EXISTS "dw"."agt_main"; CREATE TABLE "dw"."agt_main" ( "agt_id" bigserial, -- 协议编码 "agt_type" varchar(2), -- 协议类型 取值见'协议类型代码表' 1 IC卡 2 自发码 99 其他 "agt_status" varchar(2), -- 协议状态 取值见'协议状态代码表' "agt_date" varchar(30), -- 协议日期 "agt_object" varchar(100), -- 协议对象 如果是账户类型, 就存账号; 如果是合同, 就存合同号 "source_id" int8, -- 源系统编码 "source" varchar(30), -- 系统来源代码 PRIMARY KEY ("agt_id") )DISTRIBUTED BY ("agt_id");
上表中 agt_type 取值1(代表IC卡)、2(自发码),但是相应的 '协议类型代码表' 只是excel 中的列表,并没有在数据库中生成 '协议类型代码表'。
所以,在进行 join 关联时,需要进行 case 判断(映射)。当然看情况,也是可以在数据库中生成 '协议类型代码表'的。
2、例子
# 在数据库中没有将 1 与 "IC卡",2 与 "自发码" 对应起来的表
create table t_user(id serial, name varchar(20), type int); insert into t_user(name, type) values('张三', 1); # 1 代表 IC卡 insert into t_user(name, type) values('李四', 2); # 2 代表 自发码 create table t_msg(type_name varchar(20), msg varchar(20)); insert into t_msg values('IC卡', '来自IC卡系统'); insert into t_msg values('自发码', '来自自发码系统'); select * from t_user u left join t_msg m on (case when m.type_name='IC卡' then u.type=1 when m.type_name='自发码' then u.type=2 end)
# 当然也可以创建"类型表"将 1 与 "IC卡",2 与 "自发码" 对应起来
---