Oracle字符串转行函数

前言

有时候比如一个字符串 : namestr  内容:‘张三,李四,王五,刘八,肖六’  。

一张表:pati_info_basic  字段:姓名,年龄等..

我们要从该表中查出上述字符串包含的所有人的信息。

此时用:

select * from pati_info_basic where patiname where patiname in namestr

肯定是不行的。而且有时候姓名之间不是用逗号相隔,而是用其他符号相隔的呢?

 

解决方案

一个实现思路是 :先把namestr字符串转成 张三李四各为一个元组,再用in查询。

实现步骤:

  • 新建类型
CREATE OR REPLACE TYPE "TY_ROW_STR_SPLIT"  as object (strValue VARCHAR2 (4000))
CREATE OR REPLACE TYPE "TY_TBL_STR_SPLIT"   IS TABLE OF ty_row_str_split
  • 新建函数
CREATE OR REPLACE FUNCTION string_split(p_str       IN VARCHAR2,
                                    p_delimiter IN VARCHAR2)
  RETURN ty_tbl_str_split IS
  j         INT := 0;
  i         INT := 1;
  len       INT := 0;
  len1      INT := 0;
  str       VARCHAR2(4000);
  str_split ty_tbl_str_split := ty_tbl_str_split();
BEGIN
  len  := LENGTH(p_str);
  len1 := LENGTH(p_delimiter);


  WHILE j < len LOOP
    j := INSTR(p_str, p_delimiter, i);

    IF j = 0 THEN
      j   := len;
      str := SUBSTR(p_str, i);
      str_split.EXTEND;
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);

      IF i >= len THEN
        EXIT;
      END IF;
    ELSE
      str := SUBSTR(p_str, i, j - i);
      i   := j + len1;
      str_split.EXTEND;
      str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
    END IF;
  END LOOP;


  RETURN str_split;
END string_split;
View Code
  • 函数示例
select * from  table(string_split('张三||李四||王五||刘八||肖六' ,'||')) 

这时候用in查询就没问题了,其中‘||’符号可替换为任意符号。

 

posted @ 2018-12-27 16:06  周家飞少  阅读(1797)  评论(0编辑  收藏  举报