如何基于现有视图的head_fullname逻辑关联q_employee新增head_login字段?
解决方案
先保留原视图中head_fullname的生成逻辑,在此基础上关联q_employee表,复用相同的CASE逻辑匹配fullname字段,从而获取对应的login作为head_login的值。
原head_fullname生成逻辑(格式化后)
case when p.dep_id <> 'MM' then case when p.man_id = '######' then 'Special name' when m2.man_login is not null then c2.last_name || ' ' || c2.fst_name || ' ' || c2.mid_name else c3.last_name || ' ' || c3.fst_name || ' ' || c3.mid_name end else o.head_fullname end as head_fullname
新增head_login字段的两种实现方式
方式1:用子查询封装原逻辑(更易维护)
将原视图查询封装为子查询,生成head_fullname后再关联q_employee表匹配登录名:
SELECT t.*, q.login AS head_login FROM ( -- 原视图的完整查询语句,包含所有原有字段和head_fullname生成逻辑 SELECT -- 原视图的其他字段 case when p.dep_id <> 'MM' then case when p.man_id = '######' then 'Special name' when m2.man_login is not null then c2.last_name || ' ' || c2.fst_name || ' ' || c2.mid_name else c3.last_name || ' ' || c3.fst_name || ' ' || c3.mid_name end else o.head_fullname end as head_fullname -- 其他原有字段 FROM 原视图涉及的表关联语句 ) t LEFT JOIN q_employee q ON t.head_fullname = q.fullname;
方式2:直接在关联条件复用CASE逻辑
如果不想用子查询,可直接在JOIN条件中重复编写CASE逻辑进行匹配:
SELECT -- 原有字段 case when p.dep_id <> 'MM' then case when p.man_id = '######' then 'Special name' when m2.man_login is not null then c2.last_name || ' ' || c2.fst_name || ' ' || c2.mid_name else c3.last_name || ' ' || c3.fst_name || ' ' || c3.mid_name end else o.head_fullname end as head_fullname, -- 新增的head_login字段 q.login AS head_login FROM 原视图涉及的表关联语句 LEFT JOIN q_employee q ON ( case when p.dep_id <> 'MM' then case when p.man_id = '######' then 'Special name' when m2.man_login is not null then c2.last_name || ' ' || c2.fst_name || ' ' || c2.mid_name else c3.last_name || ' ' || c3.fst_name || ' ' || c3.mid_name end else o.head_fullname end ) = q.fullname;
补充说明
- 使用
LEFT JOIN可确保即使head_fullname在q_employee表中无匹配项,原视图的数据也不会丢失,此时head_login会返回NULL - 子查询写法更优,避免重复编写相同的CASE逻辑,后续维护更方便
内容的提问来源于stack exchange,提问作者Andrey Romanov
相关产品推荐
相关产品推荐

