在应用程序开发中,会出现单选或多选框条件输入的需求。如输入框的输入值为'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
分享到:
相关推荐
plsql分割字符串
将字符串分割成数组: 例如将字符串“7369,7499,7521,7844"分割成 7369 7499 7521 7844 用法:可以将分割结果做为一个数组或者数据库表列来使用 select * from scott.emp where empno in (select column_value from...
用pl/sql写一个函数, 实现根据分割符把原字符串分成若干个字符串功能
传入一个字符串和该字符串的分割字符,返回去重后的字符串,可以直接在plsql中运行,简单的函数运用,能处理oracle中。资源仅供参考
PLSQL单行函数和组函数详解PLSQL单行函数和组函数详解
自己初学时整理的PLSQL基本函数查询,其中附带了函数在《精通oracle 10g PL SQL編程》一书中的详细页码,建议结合使用。
ORACLE PLSQL函数ORACLE PLSQL函数ORACLE PLSQL函数ORACLE PLSQL函数ORACLE PLSQL函数
Oracle PLSQL 函数大全,PLSQL 函数用法总结 详解 ,很好的资料,希望对你有帮助
1-PLSQL过程函数包.pdf 写得还可以,湖南电信Oracle培训
常用plsql函数
TO_NUMBER(char[,’format_model’]) 字符转换到数字类型 TO_DATE(char[,’format_model’]) 字符转换到日期类型 格式说明符:要与前边要转换的字符串的格式要相同才能转换(匹配问题:格式和位数)。 TO_CHAR...
学习ORACLE PLSQL开发的可以下载来学习下,都是常用方法,挺好的,适合基础不是很好的开发者。
对oracle函数的总结,相当的适用哦,大家多多交流哈,共同进步
sql plsql 函数学习 Oracle 快速入门 有关表的操作 运算符 常用 ORACLE 函数(日期函数、字符函数、数字函数、转换函数、分组函数、其他函数……) 临时表 join SEQUENCE 同义词 等等
很简单,易懂的plsql函数简介。
标题:按某字段合并字符串之一(简单合并) 描述:将如下形式的数据按id字段合并value字段。 id value —– —— 1 aa 1 bb 2 aaa 2 bbb 2 ccc 需要得到结果: id value —— ———– 1 aa,bb 2 aaa,bbb,...
在sql中我判断包含字符串我们可使用很多方法如like,replace,charindex函数都可实现我们要的功能,下面我来给大家介绍判断字符串包含字符串sql语句。感兴趣的朋友一起看看吧
史上最全的oracle plsql函数大全!
代码如下: —去除字符串中重復的值函數 create function StringRemove(@str nvarchar(2000)) returns varchar(2000) as begin declare @result nvarchar(2000),@temp nvarchar(1000) set @result=” set @temp=” ...