请问如何从一列包含大小写字母、数字、汉字、全角字符的数据中只把由汉字组成的数据查出来,oracle 10g
例如表数据为createtabletmpaswithdataas(select'like'asid,'a9999'asstrfromdualunionallselect'...
例如表数据为
create table tmp as
with data as (
select 'like' as id ,'a9999' as str from dual union all
select 'like' ,'范跑跑' from dual union all
select 'like' ,'张!【】' from dual
)
select * from data ;
我本以为select * from tmp where regexp_like(str,'^[\u4e00-\u9fa5]+$')就能把‘范跑跑’那一行数据查出来,但是发现查出来的是'a9999'那一行。
不好意思只有5财富了,求大神帮忙,把范跑跑查出来,谢谢:) 展开
create table tmp as
with data as (
select 'like' as id ,'a9999' as str from dual union all
select 'like' ,'范跑跑' from dual union all
select 'like' ,'张!【】' from dual
)
select * from data ;
我本以为select * from tmp where regexp_like(str,'^[\u4e00-\u9fa5]+$')就能把‘范跑跑’那一行数据查出来,但是发现查出来的是'a9999'那一行。
不好意思只有5财富了,求大神帮忙,把范跑跑查出来,谢谢:) 展开
3个回答
展开全部
使用ASCII码 进行判断
下面的例子
Oracle ASCII码判断数字和字母方法--实用
判断参数是数字和字母
如果是数字、字母返回结果为 Y
如果是非数字非字母返回结果为N
create or replace function check_number_character(p_param in varchar2)
return varchar2
is
v_length number;
v_chr_trim varchar2(100);
v_chr varchar2(10);
v_ascii number;
v_result varchar2(1);
begin
select trim(p_param)
into v_chr_trim
from dual;
select length(v_chr_trim)
into v_length
from dual;
for i in 1..v_length loop
select substr(v_chr_trim,i,1)
into v_chr
from dual;
select ascii(v_chr)
into v_ascii
from dual;
if (v_ascii between 48 and 57) or
(v_ascii between 65 and 90) or
(v_ascii between 97 and 122) then
v_result := 'Y';
else
v_result := 'N';
return v_result;
end if;
end loop;
return v_result;
exception
when no_data_found then
dbms_output.put_line('Please input parameter!');
return 'N';
end;
下面的例子
Oracle ASCII码判断数字和字母方法--实用
判断参数是数字和字母
如果是数字、字母返回结果为 Y
如果是非数字非字母返回结果为N
create or replace function check_number_character(p_param in varchar2)
return varchar2
is
v_length number;
v_chr_trim varchar2(100);
v_chr varchar2(10);
v_ascii number;
v_result varchar2(1);
begin
select trim(p_param)
into v_chr_trim
from dual;
select length(v_chr_trim)
into v_length
from dual;
for i in 1..v_length loop
select substr(v_chr_trim,i,1)
into v_chr
from dual;
select ascii(v_chr)
into v_ascii
from dual;
if (v_ascii between 48 and 57) or
(v_ascii between 65 and 90) or
(v_ascii between 97 and 122) then
v_result := 'Y';
else
v_result := 'N';
return v_result;
end if;
end loop;
return v_result;
exception
when no_data_found then
dbms_output.put_line('Please input parameter!');
return 'N';
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一 你为什么要把这个步骤放在数据库中写呢 你可以直接查询出所有的数据 然后再外面的代码中区对着个字符串进行过滤出中文 这样就简单多了 如果你一定 要在sql里面写 可能需要些个存储过程去过滤中文字段
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
create or replace function removehanzi(p_str varchar2)
return varchar2
as
v_str varchar2(3000);
v_char varchar2(6);
v_result varchar2(3000);
begin
if p_str is null then
return null;
end if;
for i in 1..length(p_str) loop
v_char:=substr(p_str,i,1);
if lengthb(v_char)=2 then
v_result:=v_result||v_char;
end if;
end loop;
return v_result;
end;
/
,根据lengthb,length函数循环判断了。
return varchar2
as
v_str varchar2(3000);
v_char varchar2(6);
v_result varchar2(3000);
begin
if p_str is null then
return null;
end if;
for i in 1..length(p_str) loop
v_char:=substr(p_str,i,1);
if lengthb(v_char)=2 then
v_result:=v_result||v_char;
end if;
end loop;
return v_result;
end;
/
,根据lengthb,length函数循环判断了。
追问
目前想到的写法是:
select * from tmp where
regexp_like(str,'^[[:alpha:]]+$') and regexp_like(str,'^[^a-zA-Z]+$')
不知道能不能更简便,或者是会不会有没检查出来的错误
追答
你可以考虑不取出中文字符,的表达式,然后not regexp_like
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询