`
mikixiyou
  • 浏览: 1099001 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353157
社区版块
存档分类
最新评论

PLSQL表函数实现字符串拆分

阅读更多

在应用程序开发中,会出现单选或多选框条件输入的需求。如输入框的输入值为'sz',或'sz|nj|zj|nt',在SQL中会这样处理。

select * from tab_1 where col_1='sz' ;这是单选框输入。

select * from tab_1 where col_1 ='sz|nj' ;这是多选框输入。

很明显,多选输入值不会查询出结果。

 

如何解决这个问题?

 

方法一,使用动态SQL实现的方法,如拼装成这样的SQL语句:select * from tab_1 where col_1 in ('sz','nj') ;动态SQL调试麻烦。

 

方法二,将'sz|nj'拆分插入到临时表中,再关联该临时表实现,如select * from tab_1 where col_1 in (select a from tt); 但是临时表涉及到表的创建和维护,还有IO。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1681631 )

 

我最近想到一个方法:将传入的字符串以嵌套表类型返回,再以表函数回调,可实现此需求。

 

函数代码如下:

create or replace function f_get_unitstring(p_str_all in varchar2,
                                            p_str_gap in varchar2)
  return t_ntb_allstring is
  --create or replace type t_ntb_allstring  is table of varchar2(20);
  v_ntb_allstring t_ntb_allstring;

  str_unit varchar2(20);
  str_char varchar2(1);

  i_str_length number;
  i_str_index  number;

begin
  /*p_str_city:='nj~wx~sz~cz~zj~nt~yc~';*/
  --p_str_all := '1|2|3|';
  --p_str_gap := '|';

  v_ntb_allstring := t_ntb_allstring();

  i_str_length := length(p_str_all);

  i_str_index := 1;

  while (i_str_index <= i_str_length) loop
    str_char := substr(p_str_all, i_str_index, 1);
  
    if (str_char = p_str_gap) then
    
      if (str_unit is not null) then
        v_ntb_allstring.extend(1);
        v_ntb_allstring(v_ntb_allstring.count) := str_unit;
        str_unit := null;
      end if;
    
    else
      str_unit := str_unit || str_char;
    
      if (i_str_index = i_str_length) then
        v_ntb_allstring.extend(1);
        v_ntb_allstring(v_ntb_allstring.count) := str_unit;
        str_unit := '';
      end if;
    
    end if;
  
    i_str_index := i_str_index + 1;
  end loop;

  return(v_ntb_allstring);
end;

 

测试如下:

 
SQL> select * from table(f_get_unitstring('1aa|2cc|3bb','|'));
 
COLUMN_VALUE
--------------------
1aa
2cc
3bb
 
SQL> 

 

 

以上解决方法仅供参数,欢迎交流。

 

如果你有大数据量处理要求,我将此方法修改一下。转而使用pipelined函数来实现这个需求。

但在此处性能优势不会体现出来,只有在你有大数据量如亿级别的字符串拆分,它才能派上用场。

 

代码如下:

create or replace function f_get_unitstring(p_str_all in varchar2,
                                            p_str_gap in varchar2)
  return t_ntb_allstring
  pipelined is
  --create or replace type t_ntb_allstring  is table of varchar2(20);
  v_ntb_allstring t_ntb_allstring;
  str_unit varchar2(20);
  str_char varchar2(1);
  i_str_length number;
  i_str_index  number;
begin
  v_ntb_allstring := t_ntb_allstring();
  i_str_length := length(p_str_all);
  i_str_index := 1;
  while (i_str_index <= i_str_length) loop
    str_char := substr(p_str_all, i_str_index, 1);  
    if (str_char = p_str_gap) then
      if (str_unit is not null) then
        --  v_ntb_allstring.extend(1);
        --  v_ntb_allstring(v_ntb_allstring.count) := str_unit;
        pipe row(str_unit);
        str_unit := null;
      end if;
    else
      str_unit := str_unit || str_char;
      if (str_unit is not null) then
        --  v_ntb_allstring.extend(1);
        --  v_ntb_allstring(v_ntb_allstring.count) := str_unit;
        pipe row(str_unit);
        str_unit := null;
      end if;
    end if;
    i_str_index := i_str_index + 1;
  end loop;
  --return(v_ntb_allstring);
end;
 

 

这些方法仅供参考,欢迎交流。谢谢!@mikixiyou

 

 

 

5
2
分享到:
评论
2 楼 jiangwenxian 2012-10-16  
学习了,多谢!但其实加点注释会更好。
1 楼 datawarehouse 2012-09-20  
  学习了。

相关推荐

    plsql分割字符串

    通过对`FUNCTION_SF_SPLIT_STRING`的详细分析,我们可以看到,在PL/SQL中实现字符串分割不仅需要理解基本的字符串操作函数,还需要具备良好的逻辑思维和控制结构设计能力。掌握这种方法不仅可以提高数据库应用程序的...

    字符串分割成数组函数(plsql function)

    将字符串分割成数组: 例如将字符串“7369,7499,7521,7844"分割成 7369 7499 7521 7844 用法:可以将分割结果做为一个数组或者数据库表列来使用 select * from scott.emp where empno in (select column_value from...

    plsql中的字符串分割.txt

    ### PL/SQL字符串分割实现方法详解 为了实现字符串分割的功能,我们可以通过以下步骤来构建PL/SQL函数: 1. **定义输入参数**: - `p_input_string`:原始字符串。 - `p_delimiter`:分隔符。 2. **创建游标或...

    oracle-字符串去重函数

    传入一个字符串和该字符串的分割字符,返回去重后的字符串,可以直接在plsql中运行,简单的函数运用,能处理oracle中。资源仅供参考

    PLSQL应用程序开发

    - **字符串操作**:详细讲解了如何使用PLSQL来处理字符串数据,包括字符串连接、分割等操作。 - **数字处理**:探讨了如何使用PLSQL进行数值计算,以及如何处理数值类型的常见问题。 - **记录类型**:介绍了记录类型...

    SQL 16进制转10进制

    1. **字符串分割**:将十六进制字符串按照字符进行分割。 2. **字符替换**:对于十六进制中的字母部分(如A-F),将其替换为相应的十进制数值。 3. **数学计算**:利用幂运算和乘法来计算每个字符对应的十进制值,...

    oracle汉字转拼音的各种方法

    我们可以编写一个存储过程,使用Oracle的正则表达式函数和字符串操作函数,结合汉字与拼音的对应关系表,实现转换。这种方法需要维护拼音对照表,且对于多音字处理较为复杂。 3. **使用第三方函数库**: 有些第三...

    plsql--编程进阶

    - **内置函数**:PL/SQL提供了丰富的内置函数,如数学函数、字符串函数、日期函数等。 #### 三、流程控制结构 **3.1 条件控制** - **IF语句**:根据条件的不同执行不同的代码块。 - **CASE语句**:根据多个条件...

    plsql developer 7.0 最新中文手册 pdf格式

    - 支持多种变量类型,如数字、字符串等。 - 可以在测试脚本中定义这些变量,并在程序中使用它们。 **4.4 保存测试脚本** - 测试脚本可以保存起来以便后续重复使用。 **4.5 跟踪运行时间错误** - 在运行过程中遇到...

    oracle提取汉字拼音和首字母

    - 使用正则表达式或其他字符串函数拆分汉字。 - 将每个汉字映射到其对应的拼音。这通常需要一个汉字到拼音的字典表,其中包含所有汉字及其对应的拼音。 - 对于多音字,可能需要根据上下文判断正确的读音。 - 将...

    oracle 将纯文本文件导入到ORACLE中

    如果某个字段不是字符串类型,可能需要对其进行函数处理(例如使用时间函数转换日期格式)。 ##### 2.7 字符串类型的处理 对于非字符串类型的字段,可以通过SQL函数进行转换。例如,如果一个字段应该是数字但实际...

    sap (abap)编程指南

    22. **字符串操作**:`SHIFT`、`CONCATENATE`、`SPLIT`、`REPLACE` 和 `STRLEN` 分别用于字符串的移动、连接、拆分、替换和长度计算。 23. **删除多余空格**:`CONDENSE` 函数用于压缩字符串中的连续空格。 24. **...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    --字符串加解密,返回一串32位长的字符串 --Select UTL_INet.f_MD5( 'TestPassword' ) From Dual; Function f_MD5( as_SourceStr in Varchar2 --需要加密的字符串 ) Return Varchar2; --将Email地址...

    java开发md5加密方法代码

    MD5算法由Ronald Rivest于1991年设计,它将任何大小的输入(最多2^64位)转换为一个128位的哈希值,通常以32位十六进制字符串的形式表示。MD5的过程包含四个主要的处理步骤:初始化、分割、处理和组合,确保了即使...

    SQL临时表递归查询子信息并返回记录的代码

    ID`、`@temp_qid`、`@QIDtemp`、`@express`、`@k` 和 `@pattern` 等变量被声明并初始化,分别用于存储指标ID、指标属性公式ID、临时存储QID和ExpValue、当前处理的QID、表达式字符串、层级计数器和指标公式拆分字段...

    自编实用的SQL脚本管理工具(DELPHI7)

    对于SQL解析,可以使用字符串操作函数,如SplitString,来分割SQL语句,并对每条语句进行预处理。数据库交互部分,DELPHI7提供了ADO(ActiveX Data Objects)组件,如TADOConnection、TADODataset等,通过这些组件,...

    PL-SQL用户指南与参考(译)

    PL/SQL提供了大量的内置函数,涵盖了数学运算、字符串处理、日期时间操作等多个方面,极大地方便了开发者。 #### 第三章:PL/SQL数据类型 ##### 一、预定义数据类型 **1、数字型** 包括整数、浮点数等多种数值...

Global site tag (gtag.js) - Google Analytics