7
头图

测试环境:

  • 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 可以直接使用该函数,输出结果如下图所示:

    coalesce_vertica_out.png

  • WutongDB 输出结果:

    在梧桐数据库输出结果如下图所示:

    coalesce_wutongdb_out.png

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 可以直接使用该函数,输出结果如下图所示:

    ifnull_vertica_out.png

  • WutongDB 输出结果:

    在梧桐数据库输出错误,找不到该函数,如下所示:

    function ifnull() does not exist
  • WutongDB 5.4 替代方案:

    • 在 WutongDB 5.4 中,您可以使用 COALESCE() 函数来替代 ifnullisnullCOALESCE() 函数返回参数列表中的第一个非 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 可以直接使用该函数,输出结果如下图所示:

    isnull_vertica_out.png

  • 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 可以直接使用该函数,输出结果如下图所示:

    nullif_vertica_out.png

  • WutongDB 输出结果:

    在梧桐数据库输出结果如下图所示:

    nullif_wutongdb_out.png

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 可以直接使用该函数,输出结果如下图所示:

    nullifzero_vertica_out.png

  • 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 可以直接使用该函数,输出结果如下图所示:

    nvl_vertica_out.png

  • WutongDB 输出结果:

    在梧桐数据库输出结果如下图所示:

    nvl_wutongdb_out.png

  • 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 语句来实现 nvlnvl2 的功能:

      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 可以直接使用该函数,输出结果如下图所示:

    nvl2_vertica_out.png

  • WutongDB 输出结果:

    在梧桐数据库输出结果如下图所示:

    nvl2_wutongdb_out.png

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 可以直接使用该函数,输出结果如下图所示:

    zeroifnull_vertica_out.png

  • 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;

千钧
7 声望4 粉丝

不爱美食的古玩爱好者不是一个真正的程序猿!