where 子句或 on 子句中对某个字段进行条件判断映射

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 与 "自发码" 对应起来

---

原文地址:https://www.cnblogs.com/xy-ouyang/p/13494848.html