对于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
   若还有好点的方法到时候再补充;若大家有好点的方法也可以补充。

最新文章

  1. Hibernate一对多单向(双向)关联映射
  2. JavaScript模板引擎artTemplate.js——template.compile()方法
  3. Linux:-防火墙iptables如何个性化定制?
  4. Keil AGDI Header File
  5. js 字符串日期 转成 Date
  6. 170. Two Sum III - Data structure design
  7. asp.net下载的方法1
  8. ColorFilter类
  9. leetcode 算法刷题(一)
  10. Android快速开发框架——AndroidAnnotations(Code Diet)
  11. 设计模式之职责链模式(Chain of Responsibility)摘录
  12. [NOI2005]维护数列——平衡树观止
  13. java连接数据库的基本操作
  14. headpq
  15. 异步上传文件,jquery+ajax,显示进度条
  16. Linux命令之lsb_release - 查看当前系统的发行版信息
  17. The method getServletContext() is undefined for the type HttpServletRequest
  18. Angular路由与Nodejs路由的区别
  19. php 安装 Redis 扩展
  20. css3中的transform、transition、translate、animation(@keyframes)的区别

热门文章

  1. Java实现MySQL数据库备份(一)
  2. DS实验题 融合软泥怪-1
  3. 在 Linux 下搭建 Git 服务器
  4. mysql 创建索引和删除索引
  5. android 存储图片到data目录和读取data目录下的图片
  6. Java_Map_Map详解
  7. iOS - + initialize 与 +load
  8. http协议中用于上传多个文件的 multipart 字段
  9. 文件名保存为.wsf文件即可分析文件夹中每个文件的行数
  10. 基于 Token 的身份验证方法