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;

  • 函数示例
select * from  table(string_split(‘张三||李四||王五||刘八||肖六‘ ,‘||‘)) 

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

原文地址:https://www.cnblogs.com/zhoufei2514/p/10185528.html

时间: 2024-08-12 04:48:23

Oracle字符串转行函数的相关文章

Oracle列转行函数版本不兼容解决方案

业务场景 本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的.不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好.这个函数在Oracle12是没有的,在Oracle11是不太兼容的,Oracle10可以正常使用.最近遇到这个问题,网上博客很多都写到了自定义列转行函数的办法去解决.但是这种办法并不一定适用所有的业务场景.我并没有采用.不过有些场景还是可以使用的. 网上优秀例子 下面是网络记录比较详细的例

Oracle 列转行函数 Listagg()

这是一个Oracle的列转行函数:LISTAGG() 先看示例代码: Sql代码   with temp as( select 'China' nation ,'Guangzhou' city from dual union all select 'China' nation ,'Shanghai' city from dual union all select 'China' nation ,'Beijing' city from dual union all select 'USA' nat

oracle | 字符串分割函数

/** * 字符串分割函数. * @param P_STR 待分割的字符串 * @param 分隔符 * @return 自定义table类型TY_STR_SPLIT. * 使用方法 select column_value from table(fn_split('1,2',',')) * @Author: xDer */ CREATE OR REPLACE FUNCTION FN_SPLIT(P_STR IN VARCHAR2, P_DELIMITER IN VARCHAR2) RETURN

oracle 列转行函数listagg、判断函数decode

1.decode 使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 某些场景可以代替case when 2.listagg 首先看下数据情况 想把这个人的阶段列转成一行分隔显示使用listagg函数 select listagg (decode(sts,'A',coll_stage),',') within group (

oracle字符串处理函数--待整理

http://www.cnblogs.com/xd502djj/archive/2010/08/11/1797577.html http://blog.csdn.net/qq373591361/article/details/5658586 http://www.jb51.net/article/20975.htm

oracle获取字符串长度函数length()和hengthb()

原文:oracle获取字符串长度函数length()和hengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算string所占的字符长度:返回字符串的长度,单位是字符 对于单字节字符,LENGTHB和LENGTH是一样的. 如可以用length(‘string’)=lengthb(‘string’)判断字符串是否含有中文. 注: 一个汉字在Oracle数据库里占多少字节跟数据库的字符集有关,UTF8时,长度为

问题:oracle字符串函数;结果:Oracle字符串函数

Oracle字符串函数 最近换了新公司,又用回Oracle数据库了,很多东西都忘记了,只是有个印象,这两晚抽了点时间,把oracle对字符串的一些处理函数做了一下整理,供日后查看.. 平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Oracle用空格将其填充为等长,再进行比较.2.VarChar2数据类型为可变长度,虽然与VarChar数据类型是同义的,但在今后的Oracle版本中也许会

oracle正则截取字符串的函数

现在有这么一个需求, 数据库中的一个手输的'籍贯'字段,要按一定的规范截取显示在报表上,比如,如果'籍贯'的内容是:'山东省潍坊市昌乐县', 那么报表里要显示为:'山东昌乐', 如果'籍贯'是山东省潍坊市寒亭区 那么就要出来 山东潍坊,简化的基本需求就是这样,取省一级和县一级,如果县一级是个区,那就取到市一级, 没有县一级的话,是数据不规范,但是先将就着取省一级和市一级. 要实现这个目的,第一是要从数据库里把相应的字段取出来, 第二是要写一个oracle截取字符串的函数处理下'籍贯'字段. 第一

ORACLE的字符串操作函数

字符函数——返回字符值 这些函数全都接收的是字符族类型的参数(CHR 除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如: VARCHAR2数值被限制为2000字符(ORACLE 8中为4000字符),而CHAR数值被限制为255字符(在ORACLE8中是2000).当在过程性语句中使用时,它们可以被赋值给VARCHAR2 或者CHAR类型的PL/SQL变量.   chr()函数将ASCII