案例一:
场景:
底层数据库里原始表记录了用户开通的功能明细,关键字段有【购买功能】【开通状态】【过期时间】,但是【开通状态】是数字代码,不能直观分辨功能真实的开通状态。
需求:判断开通状态和过期状态并用文本展示。期望效果如下图。
解决方案:
新建计算字段,使用case when函数对开通状态和过期时间进行判断,参考写法如下:
写法1:多条件判断
case
when [开通状态]=1 and [过期时间]>= current_date() then '开通'
when [开通状态]=1 and [过期时间]< current_date() then '到期'
when [开通状态]=0 and [过期时间]>= current_date() then '试用中'
when [开通状态]=0 and [过期时间]< current_date() then '试用结束'
else '未开通'
end
写法2:嵌套case when
case when [开通状态]=1 then
case when [过期时间]>= current_date() then '开通'
when [过期时间]< current_date() then '到期'
end
when [开通状态]=0 then
case when [过期时间]>= current_date() then '试用中'
when [过期时间]< current_date() then '试用结束'
end
else '未开通'
end
案例二:
场景:
有一张Jira工单数据表,由于部分工单(一线排查工单)会关联由GALAXY/UN/AT开头的工单(后端研发工单),GALAXY/UN/AT开头的工单状态才能代表真实的工单状态,所以我们需要在ETL里对工单状态进行处理。
需求:优先使用关联的 GALAXY/UN/AT 开头的工单的状态。
实现步骤:
- 在ETL里先使用字段 LINKID 把jira工单数据表和自身关联起来,得到关联工单的相关数据;
- 添加计算列,利用逻辑函数实现优先使用 GALAXY/UN/AT 开头的工单的状态。
case when [工单号] rlike 'GALAXY|UN|AT' then [状态]
else COALESCE([关联工单状态],[状态])
end
说明:
这里使用了3个逻辑函数:
- case when : 把工单分为2类,每类按照不同逻辑处理数据;
- rlike : 判断字符串是否匹配正则表达式。
[工单号] rlike 'GALAXY|UN|AT'
用来判断 [工单号]里是否包含GALAXY、UN、AT 三者中的任一种;也可以写作 [工单号] like 'GALAXY%' or [工单号] like 'UN%' or [工单号] like 'AT%'
。正则表达式相关的逻辑函数请参考 正则表达式。 - coalesce:返回第一个非 null 值。对于不以 GALAXY/UN/AT 开头的工单,优先使用关联工单的状态,如果无关联工单,则返回工单本身的状态。