oracle 判断字段是不否全为数字

通过同事和好朋友查找,现将实现的方法给大家,a.oracle 自有函数实现 b.自定义函数实现

注意两种方法中字段都不能为null,这种情况要用case when 进行处理后方可用。

1.translate 方法,此方法是一个同事提供的特别好。

create table tux_if_number
(
serv_id number(20),
acc_nbr varchar2(30)
);
insert into tux_if_number values (1,'15204669284');
insert into tux_if_number values (2,'n045144669284');
insert into tux_if_number values (3,null);
select * from tux_if_number;
select
t.serv_id,
case when t.acc_nbr is null then -1
     when translate(t.acc_nbr,'#0123456789','#') is null then 1
     when translate(t.acc_nbr,'#0123456789','#') is not null then -1
end
from tux_if_number t;

把translate 相关用法给大家:

一、语法:  
    TRANSLATE(string,from_str,to_str)  
二、目的  
      返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE   是   REPLACE   所提供的功能的一个超集。如果   from_str   比   to_str   长,那么在   from_str   中而不在   to_str   中的额外字符将从   string   中被删除,因为它们没有相应的替换字符。to_str   不能为空。Oracle   将空字符串解释为   NULL,并且如果TRANSLATE   中的任何参数为NULL,那么结果也是   NULL。    

三、允许使用的位置  
      过程性语句和SQL语句。 

示例如下:

select   translate('abcdefghij','abcdefghij','123456')   from   dual;
select   translate('abcdefghij','abcdefghij','123456i')   from   dual;

2.自定义方法实,虽然能实现,但没有自带的方便,没有创建函数的情况下就不适用了,在这里只是要了解一下0-9的ascii为48-57即可.以下函数参考.

create or replace function if_number(in_varchar in varchar2)
return integer as flag integer;
i integer;
begin
for i in 1..length(in_varchar)
loop
if ascii(substr(in_varchar,i,1))>=48 and ascii(substr(in_varchar,i,1))<=57
then
flag:=1;
else
flag:=-1;
exit;
end if;
end loop;
return flag;
end if_number;
-- 实现和自有函数相关的sql如下:

select
t.serv_id,
case when t.acc_nbr is null then -1 else if_number(t.acc_nbr) end
from tux_if_number t;

以上仅为在开发中遇到同样的问题提供一个方法及参考,有更好的欢迎来交流

QQ:360263676

 

<think>嗯,用户问的是如何在Oracle判断字段是否包含汉字。首先,我得回忆一下Oracle的正则表达式函数,比如REGEXP_LIKE。用户可能对正则表达式太熟悉,所以需要详细解释一下。 首先,确定汉字的Unicode范围。通常汉字在Unicode中的范围是U+4E00到U+9FFF,所以正则表达式可以用[\x{4E00}-\x{9FFF}]来表示。过,Oracle的正则表达式语法可能需要用特定的转义,比如使用\\x来匹配Unicode字符。 然后,考虑Oracle的正则表达式函数是否正确使用。REGEXP_LIKE函数的基本用法是检查字段是否匹配某个模式。用户可能需要区分大小写或者区分,但这因为是汉字,可能需要考虑大小写问题。 另外,用户可能希望字段中包含至少一个汉字,所以正则表达式应该使用.*来匹配任意字符前后的汉字。比如^.*[\x{4E00}-\x{9FFF}]+.*$,过可能更简单的方式是直接检查是否存在汉字字符,需要锚点。 还要注意Oracle中正则表达式的语法是否正确,比如是否需要用双反斜杠或者特定的修饰符。比如在Oracle中,可能需要使用'c'或'i'参数来指定大小写敏感,但汉字的话可能需要。 然后,测试这个正则表达式是否有效。例如,测试数据中包含汉字的情况是否能正确匹配,含汉字的则被排除。可能需要参考一些现有的例子,比如用户提供的引用中提到的正则表达式用法,比如引用[1]中的regexp_like(id,'b','i'),说明可以使用修饰符。 最后,总结出一个正确的SQL语句,并给出示例,同时提醒可能的注意事项,比如性能问题或者字符集的影响。用户可能还需要知道如何处理多字节字符或者角字符,但这可能只需要关注基本汉字范围。 可能还需要考虑其他Unicode范围的汉字,比如扩展区,但一般情况下,4E00到9FFF应该覆盖常用汉字。如果有特殊情况,可能需要调整范围。 所以,最终的解决方案应该是使用REGEXP_LIKE函数,正则表达式模式为[\x{4E00}-\x{9FFF}],并且可能需要指定匹配参数,比如'm'或者指定。然后通过示例展示如何应用,并说明可能的情况。</think>### Oracle判断字段是否包含汉字的方法 在Oracle中,可以使用正则表达式函数`REGEXP_LIKE`结合Unicode编码范围来判断字段是否包含汉字。汉字的Unicode范围通常为`\x4E00`到`\x9FFF`[^1],具体实现如下: ```sql -- 判断字段是否包含至少一个汉字 SELECT * FROM 表名 WHERE REGEXP_LIKE(字段名, '[\x{4E00}-\x{9FFF}]', 'c'); ``` #### 关键点说明: 1. **正则表达式**:`[\x{4E00}-\x{9FFF}]`表示匹配任意一个汉字字符。`\x{4E00}`对应Unicode的汉字起始编码,`\x{9FFF}`为结束编码。 2. **参数`'c'`**:表示区分大小写(虽然汉字无大小写之分,但需显式指定模式以避免默认行为干扰)。 3. **性能建议**:若字段数据量大,建议结合索引优化,避免表扫描。 #### 示例验证: ```sql -- 测试数据 CREATE TABLE test (content VARCHAR2(50)); INSERT INTO test VALUES ('Hello 世界'); INSERT INTO test VALUES ('123abc'); -- 查询包含汉字的记录 SELECT * FROM test WHERE REGEXP_LIKE(content, '[\x{4E00}-\x{9FFF}]'); ``` 结果将返回`Hello 世界`这条记录。 #### 注意事项: - 若需匹配角符号或其他扩展汉字(如CJK扩展区),需调整Unicode范围[^2]。 - 字符集需支持Unicode(如AL32UTF8)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值