zoukankan      html  css  js  c++  java
  • 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查询就没问题了,其中‘||’符号可替换为任意符号。

    自强不息,厚德载物
  • 相关阅读:
    AcWing 524. 愤怒的小鸟
    AcWing 算法提高课题解目录
    AcWing 292. 炮兵阵地
    AcWing 798. 差分矩阵
    golang 写数据到excel文件 清明
    使用golang开发mqtt服务压力测试工具 清明
    Linux云服务器安装JDK步骤 清明
    shell monitor memory 清明
    自己实现一个Electron跨进程消息组件(兼新书自荐)
    如何把Electron做成一个Runtime,让多个应用共享同一个Electron
  • 原文地址:https://www.cnblogs.com/zhoufei2514/p/10185528.html
Copyright © 2011-2022 走看看