博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈sql的字符分割
阅读量:6157 次
发布时间:2019-06-21

本文共 1956 字,大约阅读时间需要 6 分钟。

   对于oracle;在字符串处理时;经常会遇到字符串分割的问题;可惜SQL中没有split函数;这个倒是挺困扰我们写sql的。对此;我来说说这字符串分割。

  例如对字段str中一条数据是'120-mm-265';我要取到其中的mm。若对其它语言之间;例如awk。split("120-mm-265",a,"-");print a[2];就搞定了。

  1. 可能大家觉得很简单;我用substr(str,5,2)就行了。可惜你把问题想得太简单了。我们处理是多条数据;而不是一条数据。若它下面一条的数据是'12-oko-45'。这样的话 。那就是ko;并非我们想要的oko

  2. 可能大家还会想到instr函数。这个函数是可以解决的。但是还是要借用sbustr函数

SELECT substr('120-mm-265',				instr('120-mm-265', '-', 1, 1) + 1,				instr('120-mm-265', '-', 1, 2) -				(instr('120-mm-265', '-', 1, 1) + 1)) FROM   dual

  这样的结果大家可以接受吗?

  3. 两年前;我想到一种方法。就是借用ltrim,rtrim函数。由于前面和后面都是数字

SELECT rtrim(ltrim('120-mm-265', '0123456789-'), '0123456789-')FROM   dual;

  这种情况是可以实现。但是这种情况呢'20m-mm-f25'。这种实现扩展性不强。所以这种也不考虑。

  4. 由于上面3种写法;大家能接受吗?不能接受;那就进入高级写法。

   使用正则函数。

SELECT regexp_substr('120-mm-265', '[^-]+', 1, 2)       FROM   dual;   --推荐这种。          SELECT regexp_replace('120-mm-265', '(.*)-(.*)-(.*)', '\2')       FROM   dual;

 我相信这两种方法应该可以让你满意;若还不能让你满意;那就是正则函数是10g版本才有的。若低于10g版本,那该怎么办?那就看看下面吧

  5. 自定义函数split。oracle不提供内置函数split。那么就自定义。

CREATE OR REPLACE FUNCTION splitstr(    v_desc  IN   VARCHAR,    v_icount IN NUMBER) RETURN VARCHAR IS    v_result  VARCHAR(20);    v_pos     NUMBER(2);    v_str     VARCHAR(1000);    v_count_2 NUMBER(2);    v_word    VARCHAR(20);BEGIN    v_result  := '';    v_str     := v_desc || ',,,';    v_count_2 := 0;    v_pos     := instr(v_str, ',');    WHILE v_pos > 1    LOOP        v_count_2 := v_count_2 + 1;        v_word    := substr(v_str, 1, v_pos - 1);        IF v_icount = v_count_2 THEN            v_result := v_word;            RETURN v_result;        ELSE            IF v_icount < v_count_2 THEN                RETURN '';            ELSE                IF v_str <> ',' THEN                    v_str := substr(v_str, v_pos + 1);                    v_pos := instr(v_str, ',');                END IF;            END IF;        END IF;    END LOOP;    RETURN v_result;END;

  SELECT splitstr(replace('120-mm-265','-',','),2) from dual

    这样执行就ok
   若还有好点的方法到时候再补充;若大家有好点的方法也可以补充。

转载地址:http://reafa.baihongyu.com/

你可能感兴趣的文章
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
javascript性能优化
查看>>
多路归并排序之败者树
查看>>
java连接MySql数据库
查看>>
深入python的set和dict
查看>>
Android JSON数据解析
查看>>
DEV实现日期时间效果
查看>>
java注解【转】
查看>>
centos 下安装g++
查看>>
下一步工作分配
查看>>
Response. AppendHeader使用大全及文件下载.net函数使用注意点(转载)
查看>>
jQuery最佳实践
查看>>
centos64i386下apache 403没有权限访问。
查看>>
jquery用法大全
查看>>