实测: Vertica 与 Wutong DB 函数对比测试之 _ 字符串函数篇

97 阅读35分钟
  • 测试环境:

    • Vertica: Vertica Analytic Database v11.1.1-22
    • Wutong DB: V5.4.10.0

    1. ASCII

    • 功能说明:

      ASCII(expression) 函数返回表达式中第一个字符的 ASCII 值。通常用于将字符转换为对应的 ASCII 编码。

    • 测试语句:

      select small_brand from bdcis.tb_cis_user_induser_day
      where ASCII(SUBSTR(small_brand,1,1))=76
      limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      ASCII_vertica_out.png

    • Wutong DB 输出结果:

      在梧桐数据库输出结果如下图所示:(与 Vertica 精度不同)

      ASCII_wutongdb_out.png

    2. bit_length

    • 功能说明:

      bit_length(expression) 函数返回表达式的位长度。通常用于计算二进制数据或字符串的位数。

    • 测试语句:

      select bit_length('abc'::varbinary);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:(与 Vertica 精度不同)

      24
      
    • Wutong DB 输出结果:

      在梧桐数据库输出错误,如下所示:

      type "varbinary" does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 解决方案:

      在 Wutong DB 中将导致错误,因为 Wutong DB 不支持 varbinary。取而代之的是,您可以使用 bytea 类型来表示二进制数据,并使用以下写法:

      正确的写法

      SELECT bit_length('abc'::bytea);
      

      或者,您可以使用 encode() 函数将字符串转换为十六进制格式,再将其作为 bytea 处理:

      SELECT bit_length(encode('abc'::bytea, 'hex'));
      

    3. bitcount

    • 功能说明:

      bitcount(expression) 函数返回表达式中为 1 的位的数量。该函数常用于二进制数据分析。

    • 测试语句:

      select bitcount(hex_to_binary('0x10'));
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:(与 Vertica 精度不同)

      1
      
    • Wutong DB 输出结果:

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

      function hex_to_binary(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 5.4 和 Wutong DB 6 并不直接支持 bitcount(),可以通过手动实现:

      SELECT LENGTH(REGEXP_REPLACE(TO_HEX('0x10'), '0', '', 'g'));
      

    4. bitstring_to_binary

    • 功能说明:

      bitstring_to_binary(bitstring) 函数将二进制字符串转换为实际的二进制数据。适用于处理二进制数据时的格式转换。

    • 测试语句:

      select bitstring_to_binary('0110000101100010');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

       ab
      
    • Wutong DB 输出结果:

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

      function bitstring_to_binary(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 中没有直接的替代函数,可以使用以下方式手动转换:

      SELECT encode(decode('01100001', 'hex'), 'escape');
      

    5. btrim

    • 功能说明:

      btrim(expression, characters) 函数从表达式的两端移除指定的字符。常用于清理字符串中的多余字符。

    • 测试语句:

      select
         substr(btrim((bb.REG_NBR)::varchar(32)), 1, 20)     aa        -- 身份证号码
      from gs_test.test_function_btrim bb     -- 用户日表
      order  by aa desc;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      btrim_vertica_out.png

    • Wutong DB 输出结果:

      在梧桐数据库输出结果如下图所示:(与 Vertica 精度不同)

      btrim_wutongdb_out.png

    6. character_length

    • 功能说明:

      character_length(expression) 函数返回字符串的字符长度。它通常用于计算字符串的长度,不包括尾随空格。

    • 测试语句:

      select character_length('1234  '::char(10) using octets);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      4
      
    • Wutong DB 输出结果:

      在梧桐数据库输出错误,如下所示:

      syntax error at or near "using"
      
    • Wutong DB 5.4 解决办法:

      Wutong DB 5.4 版本中,可以通过以下方式去除尾随空格并返回字符长度。这里使用 TRIM() 函数处理尾随空格,然后计算字符长度:

      示例:

      SELECT character_length(TRIM(TRAILING FROM '1234  '::char(10)));
      
      • 解释

        • TRIM(TRAILING FROM ...):去除字符串末尾的空格。
        • character_length():返回去除尾随空格后的字符长度。

      输出结果:

      4
      

      如果需要计算字节长度

      如果您需要按字节数计算,而不是字符数(这在 Vertica 中是通过 USING OCTETS 实现的),可以在 Wutong DB 中使用 octet_length() 函数:

      SELECT octet_length('1234  '::char(10));
      
      • 结果10(因为 char(10) 类型会自动填充到 10 字节,即使有尾随空格)。
    • Wutong DB 6 解决办法:

      在 Wutong DB 6 中,可以使用与 8.2.15 相同的方式来处理尾随空格和字符长度,因为两者的基本处理方式相同:

      示例:

      SELECT character_length(TRIM(TRAILING FROM '1234  '::char(10)));
      
      • 解释

        • TRIM(TRAILING FROM ...):去除尾随空格。
        • character_length():返回去除尾随空格后的字符长度。

      输出结果:

      4
      

      如果需要计算字节长度

      SELECT octet_length('1234  '::char(10));
      
      • 结果10

    7. chr

    • 功能说明:

      chr(ascii_code) 函数返回给定 ASCII 码对应的字符。该函数常用于字符和数值的转换。

    • 测试语句:

      select chr(65) from gs_test.test_function_avg limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      有数据
      
    • Wutong DB 输出结果:

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

      有数据
      

    8. collation

    • 功能说明:

      collation(expression, collation_name) 函数返回表达式按指定排序规则排序后的结果。该函数用于处理不同的字符串比较标准。

    • 测试语句:

      select collation('U.S.A','LEN_AS')=collation('USA','LEN_AS');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      TRUE
      
    • Wutong DB 输出结果:

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

      function collation(unknown, unknown) does not exist
      
    • Wutong DB 5.4 替代方案:

      Wutong DB 5.4 不支持显式设置排序规则,但可以通过强制设置排序规则来比较两个字符串。

    • Wutong DB 6 替代方案:

      Wutong DB 6 直接支持通过 COLLATE 指定排序规则:

      SELECT 'U.S.A' COLLATE "C" = 'USA' COLLATE "C";
      

    9. concat

    • 功能说明:

      concat(expression1, expression2, ...) 函数将多个字符串连接为一个字符串。通常用于合并多个字段或值。

    • 测试语句:

      select  202405 statis_month,
             a.cpid,
             a.pt,
             concat(round((a.pt/b.sum_pt)*100,2),'%') as percent
       from gs_test.test_function_concat01  a,
          gs_test.test_function_concat02 b
       order by a.cpid,a.pt,percent ;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      concat_vertica_out.png

    • Wutong DB 输出结果:

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

      operator does not exist: character varying / character varying
      
    • Wutong DB 5.4 替代方案:

      Wutong DB 5.4 不支持 concat(),但可以使用 || 操作符进行字符串连接:

      SELECT string1 || string2;
      
    • Wutong DB 6 替代方案:

      Wutong DB 6 支持 concat() 函数:

      SELECT concat(string1, string2);
      

    10. decode

    • 功能说明:

      decode(expression, search, result, ..., default) 函数在 SQL 中用于模仿 CASE 表达式,根据匹配的值返回对应的结果。常用于简化条件查询。

    • 测试语句:

      select distinct decode(a.activity_type,'1','4G 产品类 ','2',' 终端类 ','3',' 流量类 ','4',' 数字化服务类 ','5',' 基础服务类 ','6',' 其它类 ') campaign_type_name -- 活动类型名字
       from gs_test.test_function_decode a
      --where a.statis_day = 20240618 
        --and a.channel_id in ('9310100001541','9310500001562')
      order by campaign_type_name ;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      decode_vertica_out.png

    • Wutong DB 输出结果:

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

      decode_wutongdb_out.png

    11. edit_distance

    • 功能说明:

      edit_distance(string1, string2) 函数返回两个字符串之间的编辑距离,即将一个字符串转换为另一个字符串所需的最小操作数。该函数用于字符串相似性分析。

    • 测试语句:

      select edit_distance('kitten','knitting');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      3
      
    • Wutong DB 输出结果:

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

      function edit_distance(unknown, unknown) does not exist
      
    • Wutong DB 5.4 替代方案:

      在 Wutong DB 5.4 版本中,由于不支持内置的 edit_distance 函数(通常通过 levenshtein 实现),可以通过以下方式实现字符串之间的编辑距离计算:自定义函数 来实现简单的 Levenshtein 编辑距离算法。

      实现 Levenshtein 编辑距离算法

      Levenshtein 编辑距离计算两个字符串之间的最小编辑操作数(插入、删除、替换)。

      • 自定义函数实现 Levenshtein 编辑距离
      CREATE OR REPLACE FUNCTION levenshtein_distance(s1 TEXT, s2 TEXT)
      RETURNS INTEGER AS $$
      DECLARE
          l1 INTEGER := LENGTH(s1);
          l2 INTEGER := LENGTH(s2);
          d INTEGER[][] := ARRAY[]::INTEGER[];
          i INTEGER;
          j INTEGER;
          cost INTEGER;
      BEGIN
          -- 初始化矩阵
          FOR i IN 0..l1 LOOP
              d := array_append(d, ARRAY[]::INTEGER[]);
              d[i] := array_append(d[i], i);
          END LOOP;
      
          FOR j IN 0..l2 LOOP
              d[0] := array_append(d[0], j);
          END LOOP;
      
          -- 动态计算编辑距离
          FOR i IN 1..l1 LOOP
              FOR j IN 1..l2 LOOP
                  IF SUBSTRING(s1 FROM i FOR 1) = SUBSTRING(s2 FROM j FOR 1) THEN
                      cost := 0;
                  ELSE
                      cost := 1;
                  END IF;
                  d[i][j] := LEAST(
                      d[i-1][j] + 1,    -- 删除
                      d[i][j-1] + 1,    -- 插入
                      d[i-1][j-1] + cost -- 替换
                  );
              END LOOP;
          END LOOP;
      
          -- 返回编辑距离
          RETURN d[l1][l2];
      END;
      

      使用示例

      SELECT levenshtein_distance('kitten', 'sitting');
      

      这个函数会返回两个字符串之间的 Levenshtein 编辑距离。在这个例子中,结果是 3('kitten' 转换为 'sitting' 需要三次编辑操作:替换 'k' 为 's'、替换 'e' 为 'i' 和插入 'g')。

    • Wutong DB 6 替代方案:

      Wutong DB 6 支持 levenshtein() 函数,返回两个字符串的编辑距离:

      SELECT levenshtein('kitten', 'sitting');
      

    12. greatest

    • 功能说明:

      greatest(expression1, expression2, ...) 函数返回多个表达式中最大的值。通常用于比较多个字段。

    • 测试语句:

       select
        20240619         ,  -- 统计日期
        a.up_area_code  ,  -- 地市编码,全省为 999
        a.up_area_name  ,  -- 地市名称
        12              ,  -- 帧数
        ' 企业宽带净增条数(条)' ,
        a.order_id      ,  -- 排序
        value_15        , -- 目标
        value_01        , -- 当日净增
        value_02        , -- 当月净增
        value_03        , -- 累计净增
        value_04        , -- 当日到达
        greatest(value_05 ,0), -- 完成进度
        row_number()over(order by value_05 desc) -- 排名
      from gs_test.test_function_greatest a
      where up_area_code <> '999'
      order by a.up_area_code,a.up_area_name,a.order_id,value_15,value_01,value_02,value_03,value_04;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      greatest_vertica_out.png

    • Wutong DB 输出结果:

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

      greatest_wutongdb_out.png

    13. greatestb

    • 功能说明:

      greatestb(expression1, expression2, ...) 函数与 greatest 类似,但处理的是二进制字符串的比较。

    • 测试语句:

      select greatestb('7','5','10');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      7
      
    • Wutong DB 输出结果:

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

      function greatestb(unknown, unknown, unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      1、可以使用 encode() 函数

      将二进制数据(bytea 类型)转换为可比较的字符串形式(如十六进制),然后使用标准的 greatest() 函数进行比较。

      SELECT greatest(encode('abc'::bytea, 'hex'), encode('xyz'::bytea, 'hex'));
      
      • 解释

        • encode(data, 'hex'):将 bytea 数据转换为十六进制字符串格式。
        • greatest():比较多个字符串并返回最大值。

      2、使用 decode() 进行字节数据处理

      如果需要返回字节数据本身而不是转换为字符串后的最大值,可以先将二进制数据转换为十六进制字符串,比较后再使用 decode() 函数将其转换回 bytea

      SELECT decode(greatest(encode('abc'::bytea, 'hex'), encode('xyz'::bytea, 'hex')), 'hex');
      
      • 解释

        • decode(string, 'hex'):将十六进制字符串转换回 bytea 类型。
      • 示例

      • 假设您有两个二进制值 abcxyz,想要比较它们并返回较大的值:

      -- 将 'abc''xyz' 转换为 bytea 格式并进行比较
      SELECT decode(greatest(encode('abc'::bytea, 'hex'), encode('xyz'::bytea, 'hex')), 'hex');
      

      3、 处理字节数据的最大值比较

      如果 greatestb 处理的是其他形式的字节数据,例如文件的二进制内容或者特定编码格式的数据,您可以根据需要使用不同的 encode 格式(如 base64)进行处理和比较。

    14. hex_to_integer

    • 功能说明:

      hex_to_integer(hex_string) 函数将十六进制字符串转换为整数。用于处理十六进制数值数据。

    • 测试语句:

      select 20240619,
           (call_duration/60) call_duration,
           hex_to_integer(substr(to_char(cell_id),1,5)) cell_id
      from gs_test.test_function_hex_to_integer
      where call_type_id='01' and cell_id!='SBC'
      order by  call_duration,cell_id;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      hex_to_integer_vertica_out.png

    • Wutong DB 输出结果:

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

      function to_char(character varying) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持通过 to_number() 函数进行十六进制到整数的转换:

      SELECT to_number('A', 'XXXXXXXX');
      

    15. initcap

    • 功能说明:

      initcap(expression) 函数将字符串的每个单词的首字母大写,其余字母小写。常用于格式化字符串以符合标题或名称格式。

    • 测试语句:

      select initcap('john doe');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      John Doe
      
    • Wutong DB 输出结果:

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

      John Doe
      

    16. initcapb

    • 功能说明:

      initcapb(expression) 函数类似于 initcap,但处理的是字节字符串。

    • 测试语句:

      select initcapb('high speed database');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      High Speed Database
      
    • Wutong DB 输出结果:

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

      function initcapb(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 initcap() 函数,可以直接使用:

      SELECT initcap('john doe');
      

    17. insert

    • 功能说明:

      insert(original_string, position, length, replacement_string) 函数用于在原始字符串中从指定位置开始插入新的子字符串,替换指定长度的字符。

    • 测试语句:

      select insert('Warehouse',1,3,'Stor');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      Storehouse
      
    • Wutong DB 输出结果:

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

      function insert(unknown, integer, integer, unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      使用 overlay() 函数进行字符串插入:

      SELECT overlay(string placing 'substring' FROM position);
      

    18. instr

    • 功能说明:

      instr(original_string, substring) 函数返回子字符串在原始字符串中第一次出现的位置。常用于查找字符串中的子串。

    • 测试语句:

      select distinct
           substr(b.cell_name,instr(b.cell_name,'-',1,2)+1) name -- 学校名称
      from  gs_test.test_function_instr b 
      order by name;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      instr_vertica_out.png

    • Wutong DB 输出结果:

      在梧桐数据库输出错误,结果如下所示:

      syntax error at or near "name"
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      使用 position() 函数:

      SELECT position('substring' IN 'string');
      

    19. log10

    • 功能说明:

      log10(number) 函数返回给定数值的以 10 为底的对数。常用于数学和统计计算。

    • 测试语句:

      select log10(100);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      2
      
    • Wutong DB 输出结果:

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

      function log10(integer) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 log() 函数,可以使用 log(10, value) 来计算:

      SELECT log(10, number);
      

    20. instrb

    • 功能说明:

      instrb(original_string, substring) 函数类似于 instr,但处理的是字节字符串。

    • 测试语句:

      select instrb('stra β e',' β ');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      5
      
    • Wutong DB 输出结果:

      在梧桐数据库输出结果:(与 Vertica 精度不同)

      5
      

    21. isutf8

    • 功能说明:

      isutf8(expression) 函数检查给定字符串是否为有效的 UTF-8 编码。

    • 测试语句:

      select isutf8(E'\xc2\xc0');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      FALSE
      
    • Wutong DB 输出结果:

      在梧桐数据库输出错误 ,结果如下所示:

      invalid byte sequence for encoding "UTF8": 0xc2c0
      
    • Wutong DB 替代方案:

      由于 Wutong DB 默认使用 UTF-8 编码,数据库通常会自动检测并确保插入的字符串是有效的 UTF-8 编码。如果插入非 UTF-8 字符串,Wutong DB 会抛出错误。

      如果您需要在 Wutong DB 中显式检测字符串的编码为 UTF-8,可以使用以下几种方式来处理。

      1、利用数据库的默认编码设置

      Wutong DB 默认使用 UTF-8 作为数据库编码,因此通常不需要显式检测。可以通过以下 SQL 查询确认数据库编码:

      SHOW SERVER_ENCODING;
      

      如果返回 UTF8,则数据库默认会拒绝非 UTF-8 编码的字符串输入。

      2、自定义函数检测

      虽然 Wutong DB 没有直接的 isutf8 函数,但您可以编写自定义的正则表达式来检测字符串是否为有效的 UTF-8 字符。使用正则表达式匹配有效的 UTF-8 字符范围。

      例如,可以使用正则表达式来匹配 UTF-8 字符范围:

      SELECT your_string ~ '^[\x00-\x7F\xC2-\xF4][\x80-\xBF]*$' AS is_utf8;
      

    22. least

    • 功能说明:

      least(expression1, expression2, ...) 函数返回多个表达式中最小的值。通常用于比较多个字段。

    • 测试语句:

      select
        up_area_code,
        least(value_22/100,1) a,
        least(value_24/100,1) b,
        least(value_26/100,1) c,
        least(value_28/100,1) d,
        least(value_30/100,1) e
      from gs_test.test_function_least
      --where statis_day = 20240619
      --  and mms_flag = 1
      --  and up_area_code <> '999'
      order by up_area_code limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      least_vertica_out.png

    • Wutong DB 输出结果:

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

      least_wutongdb_out.png

    23. leastb

    • 功能说明:

      leastb(expression1, expression2, ...) 函数与 least 类似,但处理的是二进制字符串的比较。

    • 测试语句:

      select leastb('7','5','10');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      10
      
    • Wutong DB 输出结果:

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

      function leastb(unknown, unknown, unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 least() 函数,可以直接使用:

      SELECT least(value1, value2, ...);
      

    24. left

    • 功能说明:**

      left(expression, number) 函数返回字符串中最左边的指定数量的字符。

    • 测试语句:

      select
            charge_number as serv_number       ,
            date(left(start_time,8)) as valid_date  ,   -- 产生话单开始时间  
            '2'
        from gs_test.test_function_left             -- 流量漫游详单   
        where 
        --to_number(settle_month)='202405'          -- 账期年月 
        --filename like '%CNGO%'               -- 话单文件名文件名
        --and home_prov_code not in ('971','891')   -- 归属局代码 用户归属青海西藏不结算
        --service_type ='1'                 -- 服务类型     
        --and flow_up_dis+flow_dn_dis >0            -- 优惠上行流量   + 优惠下行流量
       charge_number is not null
        group by   
            charge_number,
            start_time
        order by serv_number,valid_date
        limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      left_vertica_out.png

    • Wutong DB 输出结果:

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

      left_wutongdb_out.png

    25. length

    • 功能说明:

      length(expression) 函数返回字符串的长度。类似于 character_length,但包括空格。

    • 测试语句:

          select
          case when length(yst_yw)>0 then left(yst_yw,length(yst_yw)-1) end  yst_yw ,-- 已渗透业务
          case when length(tj_yw)>0 then left(tj_yw,length(tj_yw)-1) end tj_yw -- 推荐业务
        from (
        select
          max(case when spt_sr>0  then ' 商铺通 ,'  else '' end)||
          max(case when sqt_sr>0  then ' 商企通 ,'  else '' end)||
          max(case when xzst_sr>0 then ' 新住宿 ,'  else '' end)||
          max(case when zx_sr>0   then ' 专线(含企业宽带),'  else '' end)||
          max(case when ydy_sr>0  then ' 移动云 ,'  else '' end)||
          max(case when qly_sr>0  then ' 千里眼(含明厨亮灶),'  else '' end) yst_yw,-- 已渗透业务
          max(case when spt_sr<=0  then ' 商铺通 ,'  else '' end)||
          max(case when sqt_sr<=0  then ' 商企通 ,'  else '' end)||
          max(case when xzst_sr<=0 then ' 新住宿 ,'  else '' end)||
          max(case when zx_sr<=0   then ' 专线(含企业宽带),'  else '' end)||
          max(case when ydy_sr<=0  then ' 移动云 ,'  else '' end)||
          max(case when qly_sr<=0  then ' 千里眼(含明厨亮灶),'  else '' end) tj_yw -- 推荐业务
        from gs_test.test_function_length b)a
        order by yst_yw,tj_yw
       ;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      length_vertica_out.png

    • Wutong DB 输出结果:

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

      length_wutongdb_out.png

    26. lower

    • 功能说明:

      lower(expression) 函数将字符串中的所有字母转换为小写。

    • 测试语句:

       select 
          substr(right(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)),
          length(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)))-3),1,
          (instr(lower(right(substr(cell_id,(instr(lower(cell_id),'-')+1),
          length(cell_id)),length(substr(cell_id,(instr(lower(cell_id),'-')+1),
          length(cell_id)))-3)),'-'))-1)   a,-- 小区编码 1
          '00'||substr(right(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)),
          length(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)))-3),
          instr(lower(right(substr(cell_id,(instr(lower(cell_id),'-')+1),
          length(cell_id)),
          length(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)))-3)),'-')+1,3) b,
          right(upper(lpad(to_hex(cast(tac_cd as integer)),8,'0')),4) c,                  -- 跟踪编码
          net_type,                                 -- 基站类型
          region_admini_name                          -- 位置类型
       from gs_test.test_function_lower
          --where 
          --net_type ='4G' and  region_code not in ('931','937')
          --and cell_id is not null
          --substr(cell_id,1,7)='460-00-'
          --and substr(cell_id,1,8) not in('460-00--','460-00- ','460-00-B','460-00-E','460-00-F','460-00-9')
          --and substr(cell_id,1,9)<>'460-00-0-'
          --and (substr(right(cell_id,2),1,1)='-' or substr(right(cell_id,4),1,1)='-' or substr(right(cell_id,3),1,1)='-')
          --and length(trim(cell_id))>10
          --translate(lower(tac_cd),'abcdeftqljlrn()-_.+',repeat('0',10)) =lower(tac_cd)
          --length(trim(translate(tac_cd,'0123456789','')))=0
          --tac_cd not like '% %'
          --      and length(village_code)=8
       order by a,b,c,net_type,region_admini_name
      limit  10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      lower_vertica_out.png

    • Wutong DB 输出结果:

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

      lower_wutongdb_out.png

    27. lowerb

    • 功能说明:

      lowerb(expression) 函数类似于 lower,但处理的是字节字符串。

    • 测试语句:

      select lowerb('The Vertica Database');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果:

      the vertica database
      
    • Wutong DB 输出结果:

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

      function lowerb(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 lower() 函数,可以直接使用:

      SELECT lower('STRING');
      

    28. lpad

    • 功能说明:

      lpad(expression, length, fill_string) 函数将填充字符添加到字符串的左侧,直到达到指定的长度。

    • 测试语句:

       select 
          substr(right(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)),
          length(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)))-3),1,
          (instr(lower(right(substr(cell_id,(instr(lower(cell_id),'-')+1),
          length(cell_id)),length(substr(cell_id,(instr(lower(cell_id),'-')+1),
          length(cell_id)))-3)),'-'))-1)   a,-- 小区编码 1
          '00'||substr(right(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)),
          length(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)))-3),
          instr(lower(right(substr(cell_id,(instr(lower(cell_id),'-')+1),
          length(cell_id)),
          length(substr(cell_id,(instr(lower(cell_id),'-')+1),length(cell_id)))-3)),'-')+1,3) b,
          right(upper(lpad(to_hex(cast(tac_cd as integer)),8,'0')),4) c,                  -- 跟踪编码
          net_type,                                 -- 基站类型
          region_admini_name                          -- 位置类型
       from gs_test.test_function_lower
          --where 
          --net_type ='4G' and  region_code not in ('931','937')
          --and cell_id is not null
          --substr(cell_id,1,7)='460-00-'
          --and substr(cell_id,1,8) not in('460-00--','460-00- ','460-00-B','460-00-E','460-00-F','460-00-9')
          --and substr(cell_id,1,9)<>'460-00-0-'
          --and (substr(right(cell_id,2),1,1)='-' or substr(right(cell_id,4),1,1)='-' or substr(right(cell_id,3),1,1)='-')
          --and length(trim(cell_id))>10
          --translate(lower(tac_cd),'abcdeftqljlrn()-_.+',repeat('0',10)) =lower(tac_cd)
          --length(trim(translate(tac_cd,'0123456789','')))=0
          --tac_cd not like '% %'
          --      and length(village_code)=8
       order by a,b,c,net_type,region_admini_name
      limit  10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      lpad_vertica_out.png

    • Wutong DB 输出结果:

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

      lpad_wutongdb_out.png

    29. ltrim

    • 功能说明:

      ltrim(expression, characters) 函数从字符串的左侧移除指定的字符。

    • 测试语句:

      select
        case when ltrim(rtrim(a.area_code)) in ('-1','0','9311','6201','6202','6203','6205') then '931'
             when ltrim(rtrim(a.area_code)) in ('930','931','932','933','934','935','936','937','938','939','941','943','945','947') then a.area_code  else '9'||substr(a.area_code,1,2) end ac, -- 地市
        case when ltrim(rtrim(a.area_code)) in ('-1','0','9311') then '3100' else a.area_code end    -- 地县
       from gs_test.test_function_ltrim a                                                        ------- 修改内容:替换来源表 bdcis.tb_cis_user_induser_info_day a  用户信息日表 20220525
       where length(trim(coalesce(a.plan_id,'')))<=16
       and a.area_code<>'7777'
       and a.statis_day = 20240619
       order by ac,area_code limit 10 ;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      ltrim_vertica_out.png

    • Wutong DB 输出结果:

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

      ltrim_wutongdb_out.png

    30. makeutf8

    • 功能说明:

      makeutf8(expression USING PARAMETERS replacement_string='^') 函数用于将字符串转换为 UTF-8 编码,如果字符串中包含无效字符,则使用指定的替代字符串替换。

    • 测试语句:

      select makeutf8(busi_name USING PARAMETERS replacement_string=' ^ ')       from gs_test.test_function_max;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      有数据
      
    • Wutong DB 输出结果:

      在梧桐数据库输出错误,结果如下所示:

      syntax error at or near "USING"
      
    • Wutong DB 替代方案:

      Wutong DB 默认处理字符串为 UTF-8 编码,因此无需额外函数。

    31. md5

    • 功能说明:

      md5(expression) 函数用于生成字符串的 MD5 哈希值,通常用于数据校验和加密操作。

    • 测试语句:

      select
        md5(a.reg_nbr)
      from gs_test.test_function_md5 a
      order by reg_nbr
      limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      MD5_vertica_out.png

    • Wutong DB 输出结果:

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

      MD5_wutongdb_out.png

    32. octet_length

    • 功能说明:

      octet_length(expression) 函数返回字符串的字节长度。与 character_length 不同,它计算的是字符串在存储中的实际字节数。

    • 测试语句:

      select '3', user_id,' 港澳证、台胞证开户姓名错误 ',' 开户姓名 '
          from  gs_test.test_function_octet_length
          where   
          --((kh_name = '' or kh_name is null ) or 
               octet_length(kh_name)<10000
               ---or (masamk.chars_check(kh_name)=1 and kh_name not like '%·%')
              -- )
      order by  user_id
      limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      octet_length_vertica_out.png

    • Wutong DB 输出结果:

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

      octet_length_wutongdb_out.png

    33. overlay

    • 功能说明:

      overlay(original_string PLACING replacement_string FROM position) 函数用于在指定位置用新的子字符串替换原始字符串中的部分内容。

    • 测试语句:

      select overlay('123456789' placing 'ABC' from 5);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      1234ABC89
      
    • Wutong DB 输出结果:

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

      1234ABC89
      

    34. overlayb

    • 功能说明:

      overlayb(original_string, replacement_string, position) 函数与 overlay 类似,但处理的是字节字符串。

    • 测试语句:

      select overlayb('123456789','xxx',2);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      1xxx56789
      
    • Wutong DB 输出结果:

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

      function overlayb(unknown, unknown, integer) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 overlay() 函数:

      SELECT overlay('abcdef' placing 'xyz' from 2 for 3);
      

    35. position

    • 功能说明:

      position(substring IN original_string) 函数返回子字符串在原始字符串中首次出现的位置。

    • 测试语句:

      select
        case when channel_name like '% 县 %' and channel_name not like '% 中移铁通 %' and channel_name not like '% 网格 %' then right(substring(channel_name from position(' 县 ' in channel_name)+length(' 县 ')),30)
              when channel_name like '% 市 %' then right(substring(channel_name from position(' 市 ' in channel_name)+length(' 市 ')),30)
              when channel_name like '% 区 %' and channel_name not like '% 小区 %' and channel_name not like '% 网格 %' then right(substring(channel_name from position(' 区 ' in channel_name)+length(' 区 ')),30) 
           else channel_name end as channel_name_alias
      from gs_test.test_function_position
      order by channel_name_alias
      limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      position_vertica_out.png

    • Wutong DB 输出结果:

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

      position_wutongdb_out.png

    36. positionb

    • 功能说明:

      positionb(substring IN original_string) 函数类似于 position,但处理的是字节字符串。

    • 测试语句:

      select positionb('stra β e',' β e');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      5
      
    • Wutong DB 输出结果:

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

      function positionb(unknown, unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      使用 position() 函数:

      SELECT position('substring' IN 'string');
      

    37. quote_ident

    • 功能说明:

      quote_ident(identifier) 函数用于将标识符(如列名、表名)转换为适合 SQL 语句中引用的格式,通常用引号括起来。

    • 测试语句:

      select quote_ident('select');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      "select"
      
    • Wutong DB 输出结果:

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

      "select"
      

    38. quote_literal

    • 功能说明:

      quote_literal(string) 函数用于将字符串转换为适合 SQL 语句中引用的格式,通常用单引号括起来,并适当转义内部的引号。

    • 测试语句:

      select quote_literal('This is a "quoted" string');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      'This is a "quoted" string'
      
    • Wutong DB 输出结果:

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

      'This is a "quoted" string'
      

    39. quote_nullable

    • 功能说明:

      quote_nullable(expression) 函数类似于 quote_literal,但它会处理 NULL 值,返回字符串或 NULL。

    • 测试语句:

      select quote_nullable('This is a "quoted" string');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      'This is a "quoted" string'
      
    • Wutong DB 输出结果:

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

      function quote_nullable(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 quote_nullable() 函数,可以直接使用:

      SELECT quote_nullable(expression);
      

    40. repeat

    • 功能说明:

      repeat(string, number) 函数将字符串重复指定的次数,生成一个新的字符串。

    • 测试语句:

      select repeat('vmart',3);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      vmartvmartvmart
      
    • Wutong DB 输出结果:

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

      vmartvmartvmart
      

    41. replace

    • 功能说明:

      replace(original_string, search_string, replacement_string) 函数在原始字符串中搜索并替换所有出现的子字符串。

    • 测试语句:

      select a.oper_staff_code userid,  -- 登陆工号
           a.oper_staff_name username,  -- 人员名称
           a.op_status status, -- 工号状态
           a.org_id orgid,     -- 组织编码 ( 固定 )
           '' Email,           -- 邮箱
           replace(replace(replace(trim(a.contact_number),'?',''),',',''),' ú ','') mobile, -- 联系电话
           a.op_passwd as password, -- 账号密码
           a.valid_date effectdate, -- 生效时间
           a.expire_date expiredate,-- 失效时间 ,
          dense_rank()over(partition by replace(replace(replace(trim(a.contact_number),'?',''),',',''),' ú ','')  order by case when oper_staff_code like '6%' then 2  else 1 end ,a.valid_date desc) rn
      from gs_test.ceshi_replace a
      where length(replace(replace(replace(trim(a.contact_number),'?',''),',',''),' ú ','')) = 11 
      and a.op_status = '1' 
      and lock_status = 'N'
      and length(a.oper_staff_code)=8
      order by userid;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      replace_vertica_out.png

    • Wutong DB 输出结果:

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

      replace_wutongdb_out.png

    42. right

    • 功能说明:

      right(expression, number) 函数返回字符串中最右边的指定数量的字符。

    • 测试语句:

      select
            statis_month,
            case when boss_opt_type in ('1','13','14','17')
                    and (opp_number_y like '00861%' or opp_number_y like '1258%' or opp_number_y like '8619%' or opp_number_y like '17951%' or opp_number_y like '01%')
                    and length(trim(opp_number_y)) > 11 then right(trim(opp_number_y),11)
                 when opp_number_y like '6601%' and length(trim(opp_number_y)) > 11 and boss_opt_type <> '1' then right(trim(opp_number_y),11)
                 when opp_number_y like '167%' and boss_opt_type = '1' then opp_number_y
                 when opp_number_y like '8616%' and length(trim(opp_number_y)) > 11 then right(trim(opp_number_y),11)
                 when boss_opt_type in ('18','9','115','3','4','1','105','107','108','121','931000','931001','931002','931003','931019','931020','931021',
                                        '931022','931029','931034') then substr(opp_up_area_code,1,3)||substr(opp_number_y,1,7)
            else opp_number_y end as one
        from gs_test.tb_cis_billing_opp_day_a_xh_1 order by one limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      right_vertica_out.png

    • Wutong DB 输出结果:

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

      right_wutongdb_out.png

    43. rpad

    • 功能说明:

      rpad(expression, length, fill_string) 函数将填充字符添加到字符串的右侧,直到达到指定的长度。

    • 测试语句:

      select rpad('database',6,'xyz');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      databa
      
    • Wutong DB 输出结果:

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

      databa
      

    44. rtrim

    • 功能说明:

      rtrim(expression, characters) 函数从字符串的右侧移除指定的字符。

    • 测试语句:

      select left(imei_number,14),
           upper(rtrim(cell_id)||base_id)
      from gs_test.tb_cis_su_gsm_list_cur_temp1 order by                 left(imei_number,14),upper(rtrim(cell_id)||base_id) limit 20;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      rtrim_vertica_out.png

    • Wutong DB 输出结果:

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

      rtrim_wutongdb_out.png

    45. sha1

    • 功能说明:

      sha1(expression) 函数生成字符串的 SHA-1 哈希值,通常用于数据加密和校验。

    • 测试语句:

      select sha1('123');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      40bd001563085fc35165329ea1ff5c5ecbdbbeef
      
    • Wutong DB 输出结果:

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

      function sha1(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 不直接支持 sha1(),需要通过 pgcrypto 扩展提供支持:

      SELECT digest('string', 'sha1');
      

    46. sha224

    • 功能说明:

      sha224(expression) 函数生成字符串的 SHA-224 哈希值,提供更高的安全性。

    • 测试语句:

      select sha224('123');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      78d8045d684abd2eece923758f3cd781489df3a48e1278982466017f
      
    • Wutong DB 输出结果:

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

      function sha224(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      同样需要 pgcrypto 扩展:

      SELECT digest('string', 'sha224');
      

    47. sha256

    • 功能说明:

      sha256(expression) 函数生成字符串的 SHA-256 哈希值,常用于需要更高安全性的场景。

    • 测试语句:

      select sha256('123');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
      
    • Wutong DB 输出结果:

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

      function sha256(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      需要 pgcrypto 扩展:

      SELECT digest('string', 'sha256');
      

    48. sha384

    • 功能说明:

      sha384(expression) 函数生成字符串的 SHA-384 哈希值,用于提供更强的加密保护。

    • 测试语句:

      select sha384('123');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      9a0a82f0c0cf31470d7affede3406cc9aa8410671520b727044eda15b4c25532a9b5cd8aaf9cec4919d76255b6bfb00f
      
    • Wutong DB 输出结果:

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

      function sha384(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      需要 pgcrypto 扩展:

      SELECT digest('string', 'sha384');
      

    49. sha512

    • 功能说明:

      sha512(expression) 函数生成字符串的 SHA-512 哈希值,适用于最高级别的安全需求。

    • 测试语句:

      select sha512('123');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2
      
    • Wutong DB 输出结果:

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

      function sha512(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      需要 pgcrypto 扩展:

      SELECT digest('string', 'sha512');
      

    50. soundex

    • 功能说明:

      soundex(expression) 函数生成字符串的 Soundex 值,用于将类似发音的字符串归为一类,通常用于模糊搜索。

    • 测试语句:

      select soundex('Smith');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      S530
      
    • Wutong DB 输出结果:

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

      function soundex(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 soundex() 函数:

      SELECT soundex('Smith');
      

    51. soundex_matches

    • 功能说明:

      soundex_matches(string1, string2) 函数用于比较两个字符串的 Soundex 值,判断它们是否发音相似。

    • 测试语句:

      select soundex_matches('Lewis','Li');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      3
      
    • Wutong DB 输出结果:

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

      function soundex_matches(unknown, unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      可以使用 soundex() 函数手动比较:

      SELECT soundex('Lewis') = soundex('Luis');
      

    52. space

    • 功能说明:

      space(number) 函数返回一个由指定数量的空格组成的字符串。

    • 测试语句:

      select 'x' || space(10) || 'y';
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      x          y
      
    • Wutong DB 输出结果:

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

      function space(integer) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      使用 repeat() 函数生成指定长度的空格:

      SELECT repeat(' ', 10);
      

    53. split_part

    • 功能说明:

      split_part(string, delimiter, index) 函数按指定分隔符分割字符串,并返回指定位置的部分。

    • 测试语句:

      select  statis_day  
       ,split_part(area_code,'+',1) area_code  
       ,split_part(area_name,'+',1) area_name         
      from gs_test.tb_mms_group_pair_sale_pk_day b 
      where statis_day = '20230731'  
       and mms_flag = 2
       and length(area_code)>4  order by area_code;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      split_part_vertica_out.png

    • Wutong DB 输出结果:

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

      split_part_wutongdb_out.png

    54. split_partb

    • 功能说明:

      split_partb(string, delimiter, index) 函数类似于 split_part,但处理的是字节字符串。

    • 测试语句:

      select split_partb('stra β e~@~caf~@~soup','~@~',3);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      soup
      
    • Wutong DB 输出结果:

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

      function split_partb(unknown, unknown, integer) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 split_part() 函数:

      SELECT split_part('abc,def,ghi', ',', 2);
      

    55. strpos

    • 功能说明:

      strpos(string, substring) 函数返回子字符串在字符串中首次出现的位置。

    • 测试语句:

      select strpos('hello world','world');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      7
      
    • Wutong DB 输出结果:

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

      7
      

    56. strposb

    • 功能说明:

      strposb(string, substring) 函数类似于 strpos,但处理的是字节字符串。

    • 测试语句:

      select strposb('stra β e','e');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      7
      
    • Wutong DB 输出结果:

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

      function strposb(unknown, unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      使用 strpos() 函数:

      SELECT strpos('abcdef', 'cd');
      

    57. substr

    • 功能说明:

      substr(string, start, length) 函数返回从字符串中指定位置开始的子字符串,长度为指定的字符数。

    • 测试语句:

      select 
        --id                                                                                    -- 记录行号  
        substr(grid_code,3,3)  ,                                                                -- 地市编码    
        substr(grid_code,4,4)  ,                                                                -- 区县编码    
        grid_code              ,                                                                -- 网格编码  
        government_id          ,                                                                -- 政企市场 Id
        louyu_name             ,                                                                -- 政企市场名称
        case when  louyu_type like '% 商务楼宇 %' then '01'
               when  louyu_type like' % 专业及综合市 %' then '04'
               when  louyu_type like '% 商业聚类 %' then '03' 
               when  louyu_type like '% 园区 %' then '02'else '05'  end   government_type    ,    -- 市场类型
        ' 未知 ' address         ,                                                                -- 地址  
        longitude              ,                                                                -- 经度 
        latitude                                                                                -- 纬度                                                              -- 数据月份
       from (select  a.*,
       row_number() over() +100000 as government_id 
       from gs_test.tb_ads_mk_group_louyu_ruge  a) as t
       order by grid_code,louyu_name limit 20;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      substr_vertica_out.png

    • Wutong DB 输出结果:

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

      substr_wutongdb_out.png

    58. substrb

    • 功能说明:

      substrb(string, start, length) 函数类似于 substr,但处理的是字节字符串。

    • 测试语句:

      select
      offer_id,
      substrb(offer_name,1,50),
      case when offer_type='50' then '1' else '2' end as offer_type,
      substrb(remark,1,200)
      from gs_test.ceshi_substrb 
      where offer_type in('50','51','52','53')
      and to_number(to_char(expire_date,'yyyymmdd'))>'20120607'
      order by offer_id
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      substrb_vertica_out.png

    • Wutong DB 输出结果:

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

      substrb_wutongdb_out.png

    59. substring

    • 功能说明:

      substring(string FROM start FOR length) 函数用于从字符串中提取指定位置的子字符串,开始位置和长度可以指定。这个函数类似于 substr,但语法稍有不同。

    • 测试语句:

      select
      channel_id,
      channel_name,
      channel_type,
                case when channel_name like '% 网格 %' then 
                    (case when channel_name like '% 中移铁通 %'  then 
                        (case when channel_name like '% 装维随销 %' then ' 装维随销渠道 ' 
                              when channel_name like '% 商客直销 %' then ' 商客直销渠道 ' 
                              when channel_name like '% 直销渠道 %' then right(substring(channel_name from position(' 网格 ' in channel_name)+length(' 网格 ')),15)
                              when channel_name like '% 特约代理点 %' then right(substring(channel_name from position(' 网格 ' in channel_name)+length(' 网格 ')),15)
                              when channel_name like '% 指定专营店 %' then right(substring(channel_name from position(' 网格 ' in channel_name)+length(' 网格 ')),15)
                          else channel_name
                         end)
                        when channel_name like'% 宽带包营人员 %' then right(substring(channel_name from position(' 人员 ' in channel_name)+length(' 人员 ')),15)
                        when channel_name like '% 网格 -%' then right(substring(channel_name from position('-' in channel_name)+length('-')),6)
                        when channel_name like'% 承包经营渠道 %' and channel_name not like '% 中移铁通 %' then ' 承包经营渠道 '
                        when (channel_name like'% 直销渠道 %' or channel_name like'% 专营店 %' or channel_name like'% 代办员 %' or channel_name like'% 承包渠道 %' 
                                                      or channel_name like'% 特约代理点 %' or channel_name like '% 服务站 %' or channel_name like '% 手机连锁 %' or channel_name like '% 服务中心 %'
                                                      or channel_name like'% 销渠道 %' or channel_name like'% 社会渠道 %' or channel_name like'% 营业厅 %' or channel_name like'% 铁通装维随销 %'
                                                      or channel_name like '% 铁通装维队 %' or channel_name like'% 便民服务点 %' or channel_name like'% 直销装维渠道 %' or channel_name like'% 铁通装维营代办点 %'
                                                      or channel_name like'% 代理点 %' or channel_name like'% 手机店 %' or channel_name like '% 经理局向 %' or channel_name like '% 渠道合伙人 %'                          
                            ) then right(substring(channel_name from position(' 网格 ' in channel_name)+length(' 网格 ')),15)
                          else channel_name
                        end
                      )
                      when channel_name like '% 县 %' and channel_name not like '% 中移铁通 %' and channel_name not like '% 网格 %' then right(substring(channel_name from position(' 县 ' in channel_name)+length(' 县 ')),30)
                      when channel_name like '% 市 %' then right(substring(channel_name from position(' 市 ' in channel_name)+length(' 市 ')),30)
                      when channel_name like '% 区 %' and channel_name not like '% 小区 %' and channel_name not like '% 网格 %' then right(substring(channel_name from position(' 区 ' in channel_name)+length(' 区 ')),30) 
                       else channel_name end as channel_name_alias
      from gs_test.tb_ado_mk_mms_automation_channel_mon_tmp0 order by channel_id  limit 20;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      substring_vertica_out.png

    • Wutong DB 输出结果:

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

      substring_wutongdb_out.png

    60. translate

    • 功能说明:

      translate(string, from_string, to_string) 函数用于将字符串中的字符替换为另一个字符串中的对应字符。这个函数类似于 replace,但可以同时替换多个字符。

    • 测试语句:

      select 1,user_id ,' 外国护照名称错误 '
      from gs_test.tb_cis_user_induser_real_cert_list_day_tmp10
      where  reg_type_nbr in ( '100000005') -- 个人客户
      and  (length(trim(translate(replace(trim(cust_name),' ','x'),'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM.','')))>=1
      or cust_name is null);
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      translate_vertica_out.png

    • Wutong DB 输出结果:

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

      translate_wutongdb_out.png

    61. trim

    • 功能说明:

      trim([LEADING | TRAILING | BOTH] characters FROM string) 函数用于去除字符串两端(或指定方向)的指定字符(默认为空格)。常用于清理数据中的不必要字符。

    • 测试语句:

      select a.oper_staff_code userid,  -- 登陆工号
           a.oper_staff_name username,  -- 人员名称
           a.op_status status, -- 工号状态
           a.org_id orgid,     -- 组织编码 ( 固定 )
           '' Email,           -- 邮箱
           replace(replace(replace(trim(a.contact_number),'?',''),',',''),' ú ','') mobile, -- 联系电话
           a.op_passwd as password, -- 账号密码
           a.valid_date effectdate, -- 生效时间
           a.expire_date expiredate,-- 失效时间 ,
          dense_rank()over(partition by replace(replace(replace(trim(a.contact_number),'?',''),',',''),' ú ','')  order by case when oper_staff_code like '6%' then 2  else 1 end ,a.valid_date desc) rn
      from gs_test.ceshi_replace a
      where length(replace(replace(replace(trim(a.contact_number),'?',''),',',''),' ú ','')) = 11 
      and a.op_status = '1' 
      and lock_status = 'N'
      and length(a.oper_staff_code)=8
      order by userid;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      trim_vertica_out.png

    • Wutong DB 输出结果:

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

      trim_wutongdb_out.png

    62. upper

    • 功能说明:

      upper(string) 函数将字符串中的所有字母转换为大写。常用于格式化数据,使其在比较时不区分大小写。

    • 测试语句:

      select left(imei_number,14),
           upper(rtrim(cell_id)||base_id)
      from gs_test.tb_cis_su_gsm_list_cur_temp1 order by   left(imei_number,14),upper(rtrim(cell_id)||base_id) limit 20;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      upper_vertica_out.png

    • Wutong DB 输出结果:

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

      upper_wutongdb_out.png

    63. upperb

    • 功能说明:

      upperb(string) 函数类似于 upper,但处理的是字节字符串。它将字节字符串中的所有字母转换为大写。

    • 测试语句:

      select upperb('AbcdEfG');
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下所示:

      ABCDEFG
      
    • Wutong DB 输出结果:

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

      function upperb(unknown) does not exist
      
    • Wutong DB 5.4 和 Wutong DB 6 替代方案:

      Wutong DB 支持 upper() 函数:

      SELECT upper('abcdef');
      

    64. right

    • 功能说明:

      right(string, length) 函数返回字符串中最右边的指定长度的子字符串。该函数在处理字符串尾部数据时非常有用。

    • 测试语句:

      select
            statis_month,
            case when boss_opt_type in ('1','13','14','17')
                    and (opp_number_y like '00861%' or opp_number_y like '1258%' or opp_number_y like '8619%' or opp_number_y like '17951%' or opp_number_y like '01%')
                    and length(trim(opp_number_y)) > 11 then right(trim(opp_number_y),11)
                 when opp_number_y like '6601%' and length(trim(opp_number_y)) > 11 and boss_opt_type <> '1' then right(trim(opp_number_y),11)
                 when opp_number_y like '167%' and boss_opt_type = '1' then opp_number_y
                 when opp_number_y like '8616%' and length(trim(opp_number_y)) > 11 then right(trim(opp_number_y),11)
                 when boss_opt_type in ('18','9','115','3','4','1','105','107','108','121','931000','931001','931002','931003','931019','931020','931021',
                                        '931022','931029','931034') then substr(opp_up_area_code,1,3)||substr(opp_number_y,1,7)
            else opp_number_y end as one
        from gs_test.tb_cis_billing_opp_day_a_xh_1 order by one limit 10;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      right_vertica_out.png

    • Wutong DB 输出结果:

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

      right_wutongdb_out.png

    65. rtrim

    • 功能说明:

      rtrim(string, characters) 函数从字符串的右侧去除指定的字符。该函数常用于清理尾部无用的字符(默认为空格)。

    • 测试语句:

      select left(imei_number,14),
           upper(rtrim(cell_id)||base_id)
      from gs_test.tb_cis_su_gsm_list_cur_temp1 order by left(imei_number,14),upper(rtrim(cell_id)||base_id) limit 20;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      rtrim_vertica_out.png

    • Wutong DB 输出结果:

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

      rtrim_wutongdb_out.png

    66. split_part

    • 功能说明:

      split_part(string, delimiter, field) 函数用于根据指定的分隔符拆分字符串,并返回指定字段的位置。它适用于解析结构化字符串数据。

    • 测试语句:

      select  statis_day  
       ,split_part(area_code,'+',1) area_code  
       ,split_part(area_name,'+',1) area_name         
      from gs_test.tb_mms_group_pair_sale_pk_day b 
       where statis_day = '20230731'  
       and mms_flag = 2
       and length(area_code)>4  order by area_code;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      split_part_vertica_out.png

    • Wutong DB 输出结果:

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

      split_part_wutongdb_out.png

    67. substr

    • 功能说明:

      substr(string, start, length) 函数从字符串的指定位置开始,返回指定长度的子字符串。该函数常用于提取字符串的部分内容。

    • 测试语句:

      select 
        --id                                                                                    -- 记录行号  
        substr(grid_code,3,3)  ,                                                                -- 地市编码    
        substr(grid_code,4,4)  ,                                                                -- 区县编码    
        grid_code              ,                                                                -- 网格编码  
        government_id          ,                                                                -- 政企市场 Id
        louyu_name             ,                                                                -- 政企市场名称
        case when  louyu_type like '% 商务楼宇 %' then '01'
               when  louyu_type like' % 专业及综合市 %' then '04'
               when  louyu_type like '% 商业聚类 %' then '03' 
               when  louyu_type like '% 园区 %' then '02'else '05'  end   government_type    ,    -- 市场类型
        ' 未知 ' address         ,                                                                -- 地址  
        longitude              ,                                                                -- 经度 
        latitude                                                                                -- 纬度                                                              -- 数据月份
       from (select  a.*,
       row_number() over() +100000 as government_id 
       from gs_test.tb_ads_mk_group_louyu_ruge  a) as t
       order by grid_code,louyu_name limit 20;
      
    • Vertica 输出结果:

      vertica 可以直接使用该函数,输出结果如下图所示:

      substring_vertica_out.png

    • Wutong DB 输出结果:

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

      substring_wutongdb_out.png