“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情”
I 预报知识
1.1 SQL中Case的使用方法
Case具有两种格式:简单Case函数和Case搜索函数。
Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
- 简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
- Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
1.2 nvl(字段,默认值)
用于判断字段是否为空,用于处理空值的。若为空,返回指代的值,否则返回本身字段的值。
II 案例
案例1:在商户表(URMTMINF)中根据信用级别CRED_LVL查询商户信息(含有业务代码字段MERC_TRD_CLS)。再将根据查询到的业务代码,到对应URMTTRADECONF表查询业务描述(MERC_TRD_DESC)。
(其中 URMTTRADECONF表存有一级业务描述MERC_TRD_DESC1和二级业务描述MERC_TRD_DESC)
其中先根据旧关联f.MERC_TRD_CLS_OLD=B.MERC_TRD_CLS,如果业务描述为空,在根据新字段关联WHERE MERC_TRD_CLS = B.MERC_TRD_CLS,如果仍为空,就赋予常量‘其他’。 如果跟旧字段关联时,有可能存在查询的二级业务描述多值的情况;此时就就查询一级业务描述。
SELECT B.MERC_ID,
B.MERC_CNM,
B.MERC_ABBR,
(CASE
WHEN B.MERC_PROV IS NOT NULL THEN
(SELECT FLD_EXP
FROM PUBTHLP
WHERE FLD_NM = 'PROV_CD'
AND FLD_VAL = B.MERC_PROV)
ELSE
B.MERC_PROV
END) AS MERC_PROV_DESC,
(CASE
WHEN B.MERC_TYP IS NOT NULL THEN
(SELECT FLD_EXP
FROM PUBTHLP
WHERE FLD_NM = 'MERC_TYP'
AND FLD_VAL = B.MERC_TYP)
ELSE
B.MERC_TYP
END) AS MERC_TYP_DESC,
(CASE
WHEN B.CRED_LVL IS NOT NULL THEN
(SELECT FLD_EXP
FROM PUBTHLP
WHERE FLD_NM = 'MERC_LVL'
AND FLD_VAL = B.CRED_LVL)
ELSE
B.CRED_LVL
END) AS CRED_LVL_DESC,
(CASE
WHEN B.MERC_TRD_CLS IS NOT NULL THEN
NVL(NVL((CASE
WHEN (SELECT COUNT(MERC_TRD_DESC) FROM payadm.URMTTRADECONF
WHERE MERC_TRD_CLS_OLD = B.MERC_TRD_CLS)>1 THEN
(SELECT DISTINCT MERC_TRD_DESC1
FROM payadm.URMTTRADECONF
WHERE MERC_TRD_CLS_OLD = B.MERC_TRD_CLS)
ELSE
(SELECT MERC_TRD_DESC
FROM payadm.URMTTRADECONF
WHERE MERC_TRD_CLS_OLD = B.MERC_TRD_CLS)
END), (SELECT MERC_TRD_DESC
FROM payadm.URMTTRADECONF
WHERE MERC_TRD_CLS = B.MERC_TRD_CLS)), '其他') ELSE '其他' END) AS MERC_TRD_DESC
FROM URMTMINF B
WHERE CRED_LVL = ?
案例二:查询非实名用户数和实名用户数
| 注册渠道 | 非实名用户数 | 实名用户数 |
|---|---|---|
| 1 | 3 | 1 |
| 2 | 1 | 2 |
注册渠道表结构
| 注册渠道 | 实名标志 |
|---|---|
| www | 01 |
| A | 02 |
| B | 01 |
| C | 02 |
| D | 01 |
| E | 01 |
| F | 01 |
select 注册渠道,A.实名用户数,B.非实名用户数
from (select 注册渠道 L,count(*) 实名用户数 from 用户表 where 实名标志='01' group by 注册渠道 )A left join
(select 注册渠道 L,count(*) 非实名用户数 from 用户表 where 实名标志='02' group by 注册渠道 )B on A.注册渠道 =B.注册渠道 ;