在应用程序开发中,会出现单选或多选框条件输入的需求。如输入框的输入值为'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
分享到:
相关推荐
通过对`FUNCTION_SF_SPLIT_STRING`的详细分析,我们可以看到,在PL/SQL中实现字符串分割不仅需要理解基本的字符串操作函数,还需要具备良好的逻辑思维和控制结构设计能力。掌握这种方法不仅可以提高数据库应用程序的...
将字符串分割成数组: 例如将字符串“7369,7499,7521,7844"分割成 7369 7499 7521 7844 用法:可以将分割结果做为一个数组或者数据库表列来使用 select * from scott.emp where empno in (select column_value from...
### PL/SQL字符串分割实现方法详解 为了实现字符串分割的功能,我们可以通过以下步骤来构建PL/SQL函数: 1. **定义输入参数**: - `p_input_string`:原始字符串。 - `p_delimiter`:分隔符。 2. **创建游标或...
传入一个字符串和该字符串的分割字符,返回去重后的字符串,可以直接在plsql中运行,简单的函数运用,能处理oracle中。资源仅供参考
- **字符串操作**:详细讲解了如何使用PLSQL来处理字符串数据,包括字符串连接、分割等操作。 - **数字处理**:探讨了如何使用PLSQL进行数值计算,以及如何处理数值类型的常见问题。 - **记录类型**:介绍了记录类型...
1. **字符串分割**:将十六进制字符串按照字符进行分割。 2. **字符替换**:对于十六进制中的字母部分(如A-F),将其替换为相应的十进制数值。 3. **数学计算**:利用幂运算和乘法来计算每个字符对应的十进制值,...
我们可以编写一个存储过程,使用Oracle的正则表达式函数和字符串操作函数,结合汉字与拼音的对应关系表,实现转换。这种方法需要维护拼音对照表,且对于多音字处理较为复杂。 3. **使用第三方函数库**: 有些第三...
- **内置函数**:PL/SQL提供了丰富的内置函数,如数学函数、字符串函数、日期函数等。 #### 三、流程控制结构 **3.1 条件控制** - **IF语句**:根据条件的不同执行不同的代码块。 - **CASE语句**:根据多个条件...
- 支持多种变量类型,如数字、字符串等。 - 可以在测试脚本中定义这些变量,并在程序中使用它们。 **4.4 保存测试脚本** - 测试脚本可以保存起来以便后续重复使用。 **4.5 跟踪运行时间错误** - 在运行过程中遇到...
- 使用正则表达式或其他字符串函数拆分汉字。 - 将每个汉字映射到其对应的拼音。这通常需要一个汉字到拼音的字典表,其中包含所有汉字及其对应的拼音。 - 对于多音字,可能需要根据上下文判断正确的读音。 - 将...
如果某个字段不是字符串类型,可能需要对其进行函数处理(例如使用时间函数转换日期格式)。 ##### 2.7 字符串类型的处理 对于非字符串类型的字段,可以通过SQL函数进行转换。例如,如果一个字段应该是数字但实际...
22. **字符串操作**:`SHIFT`、`CONCATENATE`、`SPLIT`、`REPLACE` 和 `STRLEN` 分别用于字符串的移动、连接、拆分、替换和长度计算。 23. **删除多余空格**:`CONDENSE` 函数用于压缩字符串中的连续空格。 24. **...
--字符串加解密,返回一串32位长的字符串 --Select UTL_INet.f_MD5( 'TestPassword' ) From Dual; Function f_MD5( as_SourceStr in Varchar2 --需要加密的字符串 ) Return Varchar2; --将Email地址...
MD5算法由Ronald Rivest于1991年设计,它将任何大小的输入(最多2^64位)转换为一个128位的哈希值,通常以32位十六进制字符串的形式表示。MD5的过程包含四个主要的处理步骤:初始化、分割、处理和组合,确保了即使...
ID`、`@temp_qid`、`@QIDtemp`、`@express`、`@k` 和 `@pattern` 等变量被声明并初始化,分别用于存储指标ID、指标属性公式ID、临时存储QID和ExpValue、当前处理的QID、表达式字符串、层级计数器和指标公式拆分字段...
对于SQL解析,可以使用字符串操作函数,如SplitString,来分割SQL语句,并对每条语句进行预处理。数据库交互部分,DELPHI7提供了ADO(ActiveX Data Objects)组件,如TADOConnection、TADODataset等,通过这些组件,...
PL/SQL提供了大量的内置函数,涵盖了数学运算、字符串处理、日期时间操作等多个方面,极大地方便了开发者。 #### 第三章:PL/SQL数据类型 ##### 一、预定义数据类型 **1、数字型** 包括整数、浮点数等多种数值...