oracle过滤字符串
① oracle如何去除字符串中的重复字符
代码如下:
createorreplacefunctionremove_rame_string(oldStrvarchar2,signvarchar2)
returnvarchar2is
/****************************************************
**Oracle去掉重复字符串
**函数名称:RemoveSameStr
**参数:【名称】【类型】【说明】
**oldStrvarchar2要处理的字符串
**signvarchar2字符串分隔符
**返回值:Resultvarchar2不包含重复子串的记录
****************************************************/
strvarchar2(2000);
currentIndexnumber;
startIndexnumber;
endIndexnumber;
typestr_typeistableofvarchar2(30)indexbybinary_integer;
arrstr_type;
Resultvarchar2(1000);
begin
--空字符串
ifoldStrisnullthen
return('');
endif;
--字符串太长
iflength(oldStr)>2000then
return(oldStr);
endif;
str:=oldStr;
currentIndex:=0;
startIndex:=0;
loop
currentIndex:=currentIndex+1;
endIndex:=instr(str,sign,1,currentIndex);
if(endIndex<=0)then
exit;
endif;
arr(currentIndex):=trim(substr(str,
startIndex+1,
endIndex-startIndex-1));
startIndex:=endIndex;
endloop;
--取最后一个字符串:
arr(currentIndex):=substr(str,startIndex+1,length(str));
--去掉重复出现的字符串:
foriin1..currentIndex-1loop
forjini+1..currentIndexloop
ifarr(i)=arr(j)then
arr(j):='';
endif;
endloop;
endloop;
str:='';
foriin1..currentIndexloop
ifarr(i)isnotnullthen
str:=str||sign||arr(i);
--数组置空:
arr(i):='';
endif;
endloop;
--去掉前面的标识符:
Result:=substr(str,2,length(str));
return(Result);
endremove_rame_string;
② oracle怎么截取指定字符后面的字符串,或者删除指定字符前面的字符串也行
取最后一个\后面的字符
select substr('D:\AssetsManagement\resource\ehcache\test.txt',1+(select instr ('D:\AssetsManagement\resource\ehcache\test.txt','\',1,(select length('D:\AssetsManagement\resource\ehcache\test.txt') - length(replace('D:\AssetsManagement\resource\ehcache\test.txt','\','')) from al)) from al)
,length('D:\AssetsManagement\resource\ehcache\test.txt')-(select instr ('D:\AssetsManagement\resource\ehcache\test.txt','\',1,(select length('D:\AssetsManagement\resource\ehcache\test.txt') - length(replace('D:\AssetsManagement\resource\ehcache\test.txt','\','')) from al)) from al)
) from al
如果前面D:\AssetsManagement\resource\ehcache\是固定的就直接replace了
select replace('D:\AssetsManagement\resource\ehcache\test.txt','D:\AssetsManagement\resource\ehcache\','') from al
③ oracle如何去除字符串中数字
selectreplace(translate('abc1234def678add590a','0123456789',''),'','')fromal;
④ Oracle SQL从含数字的字符串中,截取出非数字字符
这个只能祭出强大的正则表达式了,字符的正a-z A-Z ,筛选的正则表达式为regexp_substr(字段,'.*[a-zA-z]')
⑤ oracle 自定义函数处理‘过滤掉空格和其他特殊字符函数’怎么写
用regexp_replace这个函数根据正则表达式将特殊字符替换成空串
⑥ Oracle sql语句把字段中的某个字符去掉
1、创建抄测试表,
create table test_date2(id int , v_date varchar(20));
⑦ Oracle怎么用正则表达式过滤字段中"非汉字"的所有字符
varreg=/([^复s])/g;varstr="abcdef";vararr=str.match(reg);console.error(arr);
正则表达式,又称规制则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
⑧ oracle 去掉左边的字符串
可以这样试试
select replace(substr('00005xxxxxx',2,3),'') from 表名;
⑨ oracle,字符串查询处理
create table test (id int, name varchar(10) )
insert into test values (1,'a')
insert into test values (1,'b')
insert into test values (1,'c')
insert into test values (2,'a')
insert into test values (2,'b')
insert into test values (3,'a')
insert into test values (3,'c')
select id,sys_connect_by_path(name,',') from (
select id,name, row_number() over(partition by id order by name)rn,
count(*) over(partition by id ) cnt from test
) a where level=cnt
start with rn=1 connect by prior id=id and prior rn=rn-1
测试后 可用。
一楼的回答其实最容易理解了。你把它修改成动态sql 就可以了。可以不受限制了。
⑩ ORACLE中怎样用正则表达式过滤中文字符
从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以GB2312为例, 写一函数准确地从表里提取简体汉字.
假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码
并且保存到表里的汉字也都是GB2312编码的
那么也就是汉字是双字节的,且简体汉字的编码范围是
B0A1 - F7FE
换算成10进制就是
B0 A1 F7 FE
176,161 - 247,254
我们先看一下asciistr函数的定义
Non-ASCII characters are converted to the form \xxxx, where xxxx represents a UTF-16 code unit.
但是这并不表示以 "\" 开始的字符就是汉字了
举例如下
SQL> select * from test;
NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC
这里第5条记录有一个实心的五角星
然后用asciistr函数转换一下试试
SQL> select name,asciistr(name) from test;
NAME ASCIISTR(NAME)
-------------------- ----------------------
,啊OO10哈 ,\554AOO10\54C8
你好aa \4F60\597Daa
大家好aa/ \5927\5BB6\597Daa/
☆大海123 \2606\5927\6D77123
★ABC \2605ABC
我们看到最后一条记录的实心五角星也是 "\"开头的
此时我们就不能用asciistr(字段)是否存在 "\" 来判断是否含有汉字了.
我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内
[PHP]
create or replace function get_chinese(p_name in varchar2) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(mp(p_name,1010),instrb(mp(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from al where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
return v_chinese;
else
return '';
end if;
end;
/
.
[/PHP]
好,现在来执行一些语句
SQL> select * from test;
NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC
5 rows selected.
1. 列出有汉字的记录
SQL> select name from test where length(get_chinese(name))>0;
NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
4 rows selected.
2. 列出有汉字的记录,并且只列出汉字
SQL> select get_chinese(name) from test where length(get_chinese(name))>0;
GET_CHINESE(NAME)
---------------------------------------------------------------------------
啊哈
你好
大家好
大海
4 rows selected.
需要说明的是GB2312共有6763个汉字,即72*94-5=6763
我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去
============
改写这个函数,可以提取非汉字或者汉字
该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字
[PHP]
create or replace function get_chinese
(
p_name in varchar2,
p_chinese in varchar2
) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_non_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(mp(p_name,1010),instrb(mp(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from al where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
if p_chinese = '1' then
return v_chinese;
else
return v_non_chinese;
end if;
else
return '';
end if;
end;
/
.
[/PHP]
SQL> select * from a;
NAME
--------------------
我们啊、
他(艾呀)是★们
他的\啊@
SQL> select get_chinese(name,1) from a;
GET_CHINESE(NAME,1)
-----------------------------------------
我们啊
他艾呀是们
他的啊
SQL> select get_chinese(name,0) from a;
GET_CHINESE(NAME,0)
-----------------------------------------
、
()★
\@
SQL>