• 数仓的字符截取三胞胎:substrb、substr、substring


    摘要:下面就来给大家介绍这三个函数在字符截取时的一些用法与区别。

    本文分享自华为云社区《GaussDB(DWS)中的字符截取三胞胎》,作者:我站在北方的天空下 。

    在GaussDB(DWS)中关于字符截取功能的支持有个函数三胞胎,它们分别是substrb()、substr()、substring(),很多人大概只知道它们可以操作字符串截取,再深入一点可能就不是很清楚了,有的是参数截取长度、有的参数是结束位置、有的参数可以是负数、有的不能接受负数参数·····
    下面就来给大家介绍这三个函数在字符截取时的一些用法与区别吧。

    概述

    substr,substrb,substring均为字符串截取函数,都可带两个或三个参数,用于提取字符串中指定位置开始的指定长度的字符。 函数定义如下:

    1. 函数形式:
    2. substrb(string, from [, count])
    3. substr(string, from [, count])
    4. substring(string, from [, count])
    5. 参数描述:
    6. 从参数string中抽取子字符串,from表示抽取的起始位置,count表示抽取的子字符串长度。
    7. 返回值类型:
    8. text

    差异

    1. 截取单位

    substrb按字节截取,substr/substring按字符截取。以utf8编码为例,1个汉字占3个字节,当使用substrb截取长度3的子串时,只能截取到一个字符,而substr/substring可以截取到三个字符。

    1. postgres=# select substrb('hwgs华为公司',3,5),substr('hwgs华为公司',3,5),substring('hwgs华为公司',3,5);
    2. substrb | substr | substring
    3. ---------+----------+-----------
    4. gs华 | gs华为公 | gs华为公
    5. (1 row)

    2. 截取规则

    GaussDB(DWS)目前支持三种兼容模式:ORA、TD和MySQL,分别对友商的函数行为进行兼容,提升用户迁移体验。在不同兼容模式下,函数差异表现为:

    substrb(string, s[, n]):各兼容模式行为一致

    1. postgres=# select substrb('hwgs华为公司',5,3),substrb('hwgs华为公司',8,3);
    2. substrb | substrb
    3. ---------+---------
    4. |
    5. (1 row)
    6. postgres=# select substrb('hwgs华为公司',-6,3),substrb('hwgs华为公司',-3,3);
    7. substrb | substrb
    8. ---------+---------
    9. |
    10. (1 row)
    11. postgres=# select substrb('hwgs华为公司',5,0),substrb('hwgs华为公司',8,-1);
    12. substrb | substrb
    13. ---------+---------
    14. |
    15. (1 row)

    substr(string, s[, n]):s=0时存在兼容行为差异

    1. postgres=# select substr('hwgs华为公司',5,3),substr('hwgs华为公司',8,3);
    2. substr | substr
    3. --------+--------
    4. 华为公 |
    5. (1 row)
    6. postgres=# select substr('hwgs华为公司',0,3),substr('hwgs华为公司',0,3);
    7. substr | substr
    8. --------+--------
    9. hwg | hwg
    10. (1 row)
    11. mysql_db=# select substr('hwgs华为公司',0,3),substr('hwgs华为公司',0,3);
    12. substr | substr
    13. --------+--------
    14. |
    15. (1 row)

    substring(string, s[, n]):s<=0和n<0时存在兼容行为差异

    1. postgres=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3);
    2. substring | substring
    3. -----------+-----------
    4. hw | h
    5. (1 row)
    6. td_db=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3);
    7. substring | substring
    8. -----------+-----------
    9. hw | h
    10. (1 row)
    11. mysql_db=# select substring('hwgs华为公司',0,3),substring('hwgs华为公司',-1,3);
    12. substring | substring
    13. -----------+-----------
    14. |
    15. (1 row)
    16. td_db=# select substring('hwgs华为公司',0,-1);
    17. ERROR: negative substring length not allowed
    18. CONTEXT: referenced column: substring
    19. mysql_db=# select substring('hwgs华为公司',0,-1);
    20. substring
    21. -----------
    22. (1 row)

    小结

    综上,详细介绍并总结了substrb()、substr()、substring()的差异和用法,日常使用中,如果遇到截取字符串为多字节字符,或者截取参数可能为特殊值的情况,那你就要特别注意了;这篇文章,希望能帮到迷茫的你!

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    电商API接口领域,有价值数据
    C++统一初始化和初始化列表
    JVM 垃圾回收机制(可达性分析、引用计数)
    Linux学习之系统FAQ
    docker load and build过程的一些步骤理解
    【计算机网络系列】物理层②:信道复用技术(频分复用、时分复用、波分复用及码分复用)
    PCIE下载的驱动安装
    Python写猜数游戏
    Java 把多个音频拼接成一个
    通话质量好蓝牙耳机有哪些?通话品质好的蓝牙耳机推荐
  • 原文地址:https://blog.csdn.net/devcloud/article/details/125487288