zoukankan      html  css  js  c++  java
  • Oracle中字符串截取常用方法总结

    substr 函数:截取字符串
     
    语法:SUBSTR(string,start, [length])

    string:表示源字符串,即要截取的字符串。

    start:开始位置,从1开始查找。如果start是负数,则从string字符串末尾开始算起。

    length:可选项,表示截取字符串长度。

    示例:

    SELECT SUBSTR('Hello SQL!', 1) FROM dual     --截取所有字符串,返回'Hello SQL!'

    SELECT SUBSTR('Hello SQL!', 2) FROM dual     --从第2个字符开始,截取到末尾。返回'ello SQL!'

    SELECT SUBSTR('Hello SQL!', -4) FROM dual    --从倒数第4个字符开始,截取到末尾。返回'SQL!'

    SELECT SUBSTR('Hello SQL!', 3, 6) FROM dual  --从第3个字符开始,截取6个字符。返回'llo SQ'

    SELECT SUBSTR('Hello SQL!', -4, 3) FROM dual --从倒数第4个字符开始,截取3个字符。返回'SQL'


     instr 函数:返回子字符串在源字符串中的位置
     
    语法:INSTR(string,child_string,[start],[show_time])

    string:表示源字符串。

    child_string:子字符串,即要查找的字符串。

    start:可选项,开始位置,默认从1开始。如果为负数,则从右向左检索。

    show_time:可选项,表示子字符串第几次出现在源字符串当中,默认第1次,负数则报错。

    示例:

    --表示从源字符串'city_company_staff'中第1个字符开始查找子字符串'_'第1次出现的位置

    SELECT INSTR('city_company_staff', '_') FROM dual    --返回5 --表示从源字符串'city_company_staff'中第5个字符开始查找子字符串'_'第1次出现的位置

    SELECT INSTR('city_company_staff', '_', 5) FROM dual    --返回5 --表示从源字符串'city_company_staff'中第5个字符开始查找子字符串'_'第1次出现的位置

    SELECT INSTR('city_company_staff', '_', 5, 1) FROM dual    --返回5 --表示从源字符串'city_company_staff'中第3个字符开始查找子字符串'_'第2次出现的位置

    SELECT INSTR('city_company_staff', '_', 3, 2) FROM dual    --返回13 --start参数为-1,从右向左检索,查找'_'字符串在源字符串中第1次出现的位置

    SELECT INSTR('city_company_staff', '_', -1, 1) FROM dual    --返回13 --start参数为-6,从右向左检索,查找'_'字符串在源字符串中第2次出现的位置

    SELECT INSTR('city_company_staff', '_', -6, 2) FROM dual    --返回5


     substr 函数结合 instr 函数截取字符串
     
    现有需求:数据查询处理需要对code进行"拆分"

    code命名规则类似:城市_所属公司_员工职位_员工姓名

    其中,城市、公司、职位、姓民字符串长度不固定,由于字符串长度不固定,只使用substr函数无法实现需求,需配合instr函数定位到字符'_'的位置,然后使用substr函数进行截取。详细见下面例子。

    表数据如下:

    SOURCE_CODE
      BJ_BAIDU_CEO_LY
      SH_BOKE_MANAGER_LWX
      HRB_WM_CASHIER_OYZY
      获取城市:

    SELECT SUBSTR (SOURCE_CODE, 1, INSTR (SOURCE_CODE, '_', 1, 1) - 1) AS CITYFROM TABLE_CODE_TEST

    结果:

    解释:此处截取源字符串SOURCE_CODE,从第1个字符开始,由于代表城市的code长度不固定,我们无法确定截取几个字符,所以使用instr函数判断第一个'_'字符的位置,进而确定每个SOURCE_CODE截取几个字符串。

    那为什么减1呢?

    是因为INSTR (SOURCE_CODE, '_', 1, 1)获取的是源字符串中'_'字符第一次出现的位置,再减1就得出了CITY字符个数。

    获取公司:

    SELECT SUBSTR (  SOURCE_CODE,   INSTR (SOURCE_CODE, '_', 1, 1) + 1,   INSTR (SOURCE_CODE, '_', 1, 2) - INSTR (SOURCE_CODE, '_', 1, 1)-1 ) AS COMPANYFROM TABLE_CODE_TEST

    结果:

    解释:截取源字符串,从(第一个'_'出现位置+1)开始,截取个数为:第2个'_'出现位置减去第1个'_'出现位置,此时还多了一个下划线'_',再减去1即可得到代表公司字符串。

    获取姓名:

    SELECT SUBSTR (SOURCE_CODE, INSTR (SOURCE_CODE, '_', 1, 3) + 1) AS STF_NAMEFROM TABLE_CODE_TEST

    结果:

    解释:截取源字符串,从('_'第3次出现位置+1)开始截取,截取到末尾。

  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/cainiaoputeng/p/12160321.html
Copyright © 2011-2022 走看看