测试环境:
- Vertica: Vertica Analytic Database v11.1.1-22
- WutongDB: V5.4.10.0
1. coalesce
功能说明:
coalesce(expression1, expression2, ..., expressionN)
返回参数列表中第一个非 NULL 的表达式值。如果所有表达式都是 NULL,则返回 NULL。这个函数非常适合处理多个可能为 NULL 的列,返回第一个非 NULL 的值。测试语句:
select coalesce( case when upp_area_code in ( '930', '931', '932', '933', '934', '935', '936', '937', '938', '939', '941', '943', '945', '947' ) then upp_area_code else '931' end, '999' ) upp_area_code from gs_test.tb_mk_library_middle_B7_list_day group by rollup( case when upp_area_code in ( '930', '931', '932', '933', '934', '935', '936', '937', '938', '939', '941', '943', '945', '947' ) then upp_area_code else '931' end )
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
2. ifnull
功能说明:
ifnull(expression, replacement)
返回expression
的值,如果它不为 NULL;否则,返回replacement
的值。测试语句:
select a.statis_month, -- 月份 a.agent_id, -- 渠道编码 a.channel_name, -- 渠道名称 c.grid_code, -- 网格编码 c.grid_name, -- 网格名称 ifnull(b.rwd_type_one_id, '100013'), -- 一级指标编码 ifnull(b.rwd_type_one_name, ' 其他 '), -- 一级指标名称 a.rule_type, -- 二级指标编码 ifnull( b.rwd_type_two_name, right( a.rwd_rule_type_name, length(a.rwd_rule_type_name) - 3 ) ), -- 二级指标名称 a.count_money / 100 -- 指标金额 from gs_test.tb_bds_cust_chl_tf_reward_cal_mon a left join gs_test.tb_bds_cust_chl_tf_reward_classify_mon b on a.rule_type = b.rwd_type_two_id left join gs_test.tb_bds_cfg_dimp_grid_channel_day c on a.agent_id = c.channel_id limit 20;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出错误,找不到该函数,如下所示:
function ifnull() does not exist
WutongDB 5.4 替代方案:
在 WutongDB 5.4 中,您可以使用
COALESCE()
函数来替代ifnull
和isnull
。COALESCE()
函数返回参数列表中的第一个非 NULL 值。SELECT COALESCE(expression, replacement) AS result;
函数说明:
COALESCE(expression1, expression2, ...)
:返回第一个非 NULL 的表达式值。如果所有表达式都为 NULL,则返回 NULL。
WutongDB 6 替代方案:
WutongDB 6 继续使用
COALESCE()
函数,语法和功能与 8.2.15 版本相同:SELECT COALESCE(expression, replacement) AS result;
3. isnull
功能说明:
isnull(expression, replacement)
功能与ifnull
类似,检查expression
是否为 NULL。如果为 NULL,则返回replacement
;否则返回expression
的值。测试语句:
select count(distinct access_num) cnt_all, count(distinct case when user_state ='0' then access_num end) cnt_suc from gs_test.tb_bds_cust_ci_cm_realname_again_day where interval_hours='24' and check_state ='0' -- 二次实人认证状态 and to_timestamp(should_stop_time,'yyyymmddhhmiss')<sysdate and isnull(ext_val_two,'') not in ('9001| 账务预销户用户只能进行账务开机 !','9001| 根据之前状态和操作码在状态机缓存中没有查询到对应的下一个状态 ! 请核实该用户是否重复停机!','9001| 只有正常用户和账务预销户用户才进行停开机 !')
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出错误,找不到该函数,如下所示:
function isnull() does not exist
WutongDB 替代方案:
- 请参考 ifnull 的解决替代方案。
4. nullif
功能说明:
nullif(expression1, expression2)
如果expression1
等于expression2
,则返回 NULL;否则返回expression1
的值。通常用于防止除零错误。测试语句:
select a.grid_code as grid_code, -- 网格编码 sum(case when b.statis_day='20240601' then val_hb_ch_d_003 else 0 end)/ nullif(sum(case when b.statis_day='20240531' then val_hb_ch_d_003 else 0 end),0)*100 as mbhlwl_cnt -- 魔百和离网率 from gs_test.tb_bds_cfg_dimp_grid_channel_day a left join gs_test.tb_lb_home_magic_channel_day b on a.channel_id=b.channel_id group by a.grid_code order by a.grid_code;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
5. nullifzero
功能说明:
nullifzero(expression)
如果expression
为零,则返回 NULL;否则返回expression
的值。常用于避免在除法操作中出现零值。测试语句:
select count( case when nullifzero(mod(birth_month,10) - 6) is null then null else 1 end ) / count(1) as ' 非六月出生占比 ' from (select * from bdcis.tb_cis_user_induser_day order by user_id limit 10000) a;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出错误,找不到该函数,如下所示:
function nullifzero() does not exist
WutongDB 5.4 替代方案:
在 WutongDB 5.4 中,您可以通过结合
NULLIF()
和直接检查表达式是否为 0 来实现相同的功能:SELECT NULLIF(expression, 0) AS result;
函数说明:
NULLIF(expression1, expression2)
:如果expression1
等于expression2
,则返回 NULL;否则返回expression1
的值。
WutongDB 6 替代方案:
WutongDB 6 版本同样使用
NULLIF()
函数来实现相同的功能:SELECT NULLIF(expression, 0) AS result;
6. nvl
功能说明:
nvl(expression, replacement)
如果expression
为 NULL,则返回replacement
的值;否则返回expression
的值。该函数是处理 NULL 值的常用方法。测试语句:
select max(obj_type) ,-- 对象类型 1 省公司 2 市公司 3 分公司 4 网格 5 责任田 固定长度 1 位 obj_id ,-- 对象编码 动态长度 取地域编码 max(obj_name) ,-- 对象名称 max(obj_path) ,-- 对象路径 sum(nvl(index_value,0)),-- 当月通信份额 sum(nvl(index_value_last,0)) -- 去年 12 月通信份额 from gs_test.tb_ado_index_c_txkh_mon_tmp26_1 group by obj_id order by obj_id limit 20;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
WutongDB 5.4 替代方案:
在 WutongDB 5.4 中,可以使用
COALESCE()
替代nvl
,而nvl2
可以通过CASE
语句来实现:SELECT COALESCE(expression, replacement) AS result_nvl; SELECT CASE WHEN expression IS NOT NULL THEN value_if_not_null ELSE value_if_null END AS result_nvl2;
函数说明:
CASE WHEN ... THEN ... ELSE ... END
:条件表达式,根据逻辑判断返回不同的结果。
WutongDB 6 替代方案:
在 WutongDB 6 中同样可以使用
COALESCE()
和CASE
语句来实现nvl
和nvl2
的功能:SELECT COALESCE(expression, replacement) AS result_nvl; SELECT CASE WHEN expression IS NOT NULL THEN value_if_not_null ELSE value_if_null END AS result_nvl2;
7. nvl2
功能说明:
nvl2(expression, value_if_not_null, value_if_null)
检查expression
是否为 NULL。如果不为 NULL,则返回value_if_not_null
的值;如果为 NULL,则返回value_if_null
的值。测试语句:
select oper_trunc_date ,count(1) from (select case when months_between(trunc(date('20000224')), to_date(substr(operator_iden_nr, 7, 8), 'yyyymmdd')) / 12 < 16 then ' 经办人当前日期到证件生日不满足 16 岁 ' else nvl2(operator_iden_nr, operator_iden_nr, ' 无经办人证件 ') end oper_trunc_date from gs_test.tb_mk_16_age_check_tmp01 a, gs_test.um_subscriber_day d ) t1 group by t1.oper_trunc_date;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出结果如下图所示:
8. zeroifnull
功能说明:
zeroifnull(expression)
如果expression
为 NULL,则返回零;如果不为 NULL,则返回expression
的值。常用于在数值计算中将 NULL 值替换为零。测试语句:
select sum(zeroifnull(case when user_level <=3 then null else 1 end)) / count(1) as ' 三级以上占比 ' from (select * from bdcis.tb_cis_user_induser_day order by user_id desc limit 10000) a;
Vertica 输出结果:
vertica 可以直接使用该函数,输出结果如下图所示:
WutongDB 输出结果:
在梧桐数据库输出错误,找不到该函数,如下所示:
function zeroifnull() does not exist
WutongDB 5.4 替代方案:
在 WutongDB 5.4 中,可以使用
COALESCE()
函数来实现类似的功能,将 NULL 替换为 0:SELECT COALESCE(expression, 0) AS result;
函数说明:
COALESCE(expression1, expression2, ...)
:返回第一个非 NULL 的表达式值。如果所有表达式都为 NULL,则返回 NULL。
WutongDB 6 替代方案:
WutongDB 6 中依然可以使用
COALESCE()
函数来替代zeroifnull
,语法与 8.2.15 版本一致:SELECT COALESCE(expression, 0) AS result;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。