oracle sql 去掉汉字保留数字或字母

本文介绍Oracle SQL中的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。
三、transate使用示例

dw@dw>column col1 format a10
dw@dw>column col2 format a10
dw@dw>select translate('helloword',
2 'abcdefghijklmnopqrstuvwxyz',
3 'zyxwvutsrqponmlkjihgfedcba') col1,
4 translate('hbcadhlk',
5 'abcdefghijklmnopqrstuvwxyz',
6 '123456') col2
7 from dual;

COL1 COL2
---------- ----------
svooldliw 2314

已选择 1 行。

已用时间: 00: 00: 00.01
我们在实际工作中,经常用到的去掉汉字保留数字或字母,也有可能是去掉数字或字母,保留汉字。
本文将用oracle sql tranlsate函数实现去掉汉字、保留数字;去掉数字和母、保留汉字,本文所用到sql如下:

create table oracle_extract_number (
id number,
name varchar2(50)
);

insert into oracle_extract_number(id,name) values(1,'32提取汉字中11222的333数44411字11');
insert into oracle_extract_number(id,name) values(1,'ad提取汉字中11dddfw222的3ddd33数444dd11字11');
insert into oracle_extract_number(id,name) values(1,'abd2提取汉字中11222的333数44ddd411字11');
insert into oracle_extract_number(id,name) values(1,'45提取汉233字中1ddd1222ddd的333数44411字11');
insert into oracle_extract_number(id,name) values(1,'78提取汉字中112SDD22的33ddad3数44ddfdf411字11');

commit;
1.用oracle translate去掉汉字和字母,提取数字

dw@dw>select id,name,
2 translate(name, '#' ||
3 translate(name, '0123456789', '#'), '/') "oracle extract number"
4 from oracle_extract_number;

ID NAME oracle extract number
---------- -------------------------------------------------- ------------------------------
1 32提取汉字中11222的333数44411字11 32112223334441111
2 ad提取汉字中11dddfw222的3ddd33数444dd11字11 112223334441111
3 abd2提取汉字中11222的333数44ddd411字11 2112223334441111
4 45提取汉233字中1ddd1222ddd的333数44411字11 45233112223334441111
5 78提取汉字中112SDD22的33ddad3数44ddfdf411字11 78112223334441111

已选择5行。

已用时间: 00: 00: 00.03
2.用oracle translate去掉汉字,提取数字和字母

dw@dw>select id,name,
2 translate(name,'#'||
3 translate(name,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789','#')
4 ,'/') "oracle extract number"
5 from oracle_extract_number;

ID NAME oracle extract number
---------- -------------------------------------------------- ------------------------------
1 32提取汉字中11222的333数44411字11 32112223334441111
2 ad提取汉字中11dddfw222的3ddd33数444dd11字11 ad11dddfw2223ddd33444dd1111
3 abd2提取汉字中11222的333数44ddd411字11 abd21122233344ddd41111
4 45提取汉233字中1ddd1222ddd的333数44411字11 452331ddd1222ddd3334441111
5 78提取汉字中112SDD22的33ddad3数44ddfdf411字11 78112SDD2233ddad344ddfdf41111

已选择5行。

已用时间: 00: 00: 00.00
3.用oracle translate去掉数字和字母,提取汉字

dw@dw>select id,
2 name,
3 translate(name,
4 '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
5 '/') "oracle extract number"
6 from oracle_extract_number;

ID NAME oracle extract number
---------- -------------------------------------------------- ---------------------------
1 32提取汉字中11222的333数44411字11 提取汉字中的数字
2 ad提取汉字中11dddfw222的3ddd33数444dd11字11 提取汉字中的数字
3 abd2提取汉字中11222的333数44ddd411字11 提取汉字中的数字
4 45提取汉233字中1ddd1222ddd的333数44411字11 提取汉字中的数字
5 78提取汉字中112SDD22的33ddad3数44ddfdf411字11 提取汉字中的数字

已选择5行。

已用时间: 00: 00: 00.01


本文来自iDB Stock:http://www.idb-stock.net/idb/2011/06/15/176.html

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think> 我们想要从Oracle数据库的某个字段中提取仅包含汉字字母(大小写)和数字的字符,去除其他特殊字符(如标点、空格等)。在Oracle中,可以使用正则表达式函数REGEXP_REPLACE来实现。 思路:使用REGEXP_REPLACE函数,匹配所有非汉字、非字母(a-z,A-Z)和非数字(0-9)的字符,并将它们替换为空字符串。 注意:汉字的Unicode范围一般是\u4E00-\u9FA5,但Oracle的正则表达式不支持\u形式的Unicode,所以我们可以使用POSIX字符类者指定Unicode范围的方式。在Oracle中,可以使用[:alnum:]来匹配字母数字,但汉字不在其中,所以需要单独处理汉字。 我们可以这样写正则表达式: 1. 匹配非汉字、非字母、非数字的字符:可以使用 [^[:alnum:]\u4E00-\u9FA5] 但是Oracle中不能直接使用\u,所以需要换一种方式。 在Oracle中,我们可以使用以下方式表示汉字范围: 汉字的Unicode范围是4E00到9FA5,在Oracle的正则表达式中,我们可以使用十六进制表示:'[^\u4E00-\u9FA5a-zA-Z0-9]',但是Oracle的REGEXP_REPLACE默认不支持这种表示法。 实际上,Oracle从10g开始支持正则表达式,但默认不支持Unicode字符类。因此,我们需要使用另一种方法:指定Unicode字符。 在Oracle中,我们可以使用`REGEXP_REPLACE`并指定`'c'`(表示使用Unicode)标志,者使用`NLS_SORT`等参数?但更简单的方式是直接列出汉字的范围(在Oracle中,汉字的范围可以用`CHR(19968) || '-' || CHR(40869)`表示,因为19968是4E00的十进制,40869是9FA5的十进制?实际上9FA5的十进制是40869?我们来计算一下:4E00十六进制是4*16^3+14*16^2+0*16+0=4*4096+14*256=16384+3584=19968,9FA5=9*16^3+15*16^2+10*16+5=9*4096+15*256+160+5=36864+3840+165=40869,没错)。 但是,在正则表达式中直接写一个很大的范围可能会影响性能,而且Oracle的正则表达式引擎可能不支持直接写这样的范围(特别是当字符串很长时)。 另一种方法是使用多个replace者编写PL/SQL函数,但这样效率较低。 因此,我们可以尝试使用如下正则表达式: [^[:alnum:]一-龥] 其中,“一”是汉字第一个常用字(Unicode 4E00),“龥”是最后一个(9FA5)。在Oracle中,这样写可以表示汉字范围吗?实际上,在Oracle中,我们可以使用“一”到“龥”来表示汉字范围,因为“一”的Unicode是4E00,“龥”的Unicode是9FA5。 所以,正则表达式可以写成:`[^a-zA-Z0-9一-龥]`。注意,这个范围包括了基本汉字(CJK Unified Ideographs),但不包括扩展汉字。 因此,我们可以这样写: SELECT REGEXP_REPLACE(your_column, '[^a-zA-Z0-9一-龥]', '') FROM your_table; 但是,请注意:这个正则表达式在Oracle中是否有效取决于数据库的字符集和NLS设置。如果数据库字符集不支持Unicode,则可能无法正确识别汉字。 另外,如果只想保留汉字字母数字,那么可以写成: REGEXP_REPLACE(your_column, '[^a-zA-Z0-9一-龥]', '') 但是,上述正则表达式中的“一-龥”在Oracle中可能不被识别为连续汉字范围,因为Oracle的REGEXP_REPLACE函数使用的是POSIX风格的正则表达式,并且对Unicode的支持有限。在Oracle 11g及以上版本,如果数据库的字符集是AL32UTF8,那么它应该可以处理Unicode字符。 另一种更可靠的方法是使用Oracle的POSIX字符类,但是汉字并不在[:alnum:]中。因此,我们可以这样写: REGEXP_REPLACE(your_column, '[^\w]', '') 但是,\w在Oracle中只匹配字母数字和下划线,而且取决于NLS设置,它可能不能匹配汉字。 所以,如果我们需要匹配汉字,最好还是使用显式的范围。我们可以使用: REGEXP_REPLACE(your_column, '[^[:alnum:]一-龥]', '', 1, 0, 'c') 其中,'c'参数表示进行大小写敏感且使用数据库定义的字符集的比较。这样可能会正确识别汉字。 但是,我们也可以尝试不指定'c',因为默认情况下,Oracle的REGEXP_REPLACE对字符串的处理是基于数据库字符集的。 为了安全起见,我们可以先测试一下。 如果上述方法不行,我们可以考虑使用TRANSLATE函数,但TRANSLATE函数不能使用范围,所以需要列出所有要保留的字符,这显然不现实。 因此,我们推荐使用正则表达式,并假设数据库字符集是AL32UTF8(支持Unicode)。 示例SQL: SELECT REGEXP_REPLACE('测试123abc!@#', '[^a-zA-Z0-9一-龥]', '') AS result FROM DUAL; 预期结果:'测试123abc' 注意:如果字符串中有全角字母数字,它们不会被保留,因为我们的正则表达式只保留半角字母数字。如果需要保留全角字母数字,需要将全角字母数字也加入范围,例如: 全角数字:0-9(Unicode: FF10-FF19) 全角大写字母:A-Z(Unicode: FF21-FF3A) 全角小写字母:a-z(Unicode: FF41-FF5A) 这样正则表达式会变得非常复杂。 因此,根据需求,如果只需要半角字母数字汉字,那么使用上面的方法即可。 如果需求是只保留汉字字母(包括全角)和数字(包括全角),那么我们需要扩展正则表达式。 但原问题只要求汉字字母数字,没有特别说明全角半角,通常指的是半角字母数字汉字。所以,我们按照半角字母数字汉字来处理。 因此,最终答案可以这样写: 使用REGEXP_REPLACE函数,将列中非汉字、非字母(a-z,A-Z)、非数字(0-9)的字符替换为空字符串: SELECT REGEXP_REPLACE(column_name, '[^a-zA-Z0-9一-龥]', '') FROM table_name; 注意:如果数据库中的字符集不是Unicode,者NLS设置不支持,可能无法正确识别汉字范围。如果遇到问题,可能需要调整范围使用其他方法。 另外,如果字符串中有换行符等,正则表达式中的点号(.)默认不匹配换行符,但我们这里不是用点号,而是用排除法,所以换行符也会被排除(因为换行符不在我们保留的范围内)。 所以,我们这样回答: </think> 在Oracle数据库中,若需从字符串中仅提取汉字字母(大小写)和数字字符,可通过正则表达式函数`REGEXP_REPLACE`实现。核心方法是**匹配并移除所有非目标字符**: ### 解决方案 ```sql SELECT REGEXP_REPLACE( your_column, -- 目标字段 '[^[:alnum:]\u4E00-\u9FA5]', -- 正则表达式:匹配非字母/数字/汉字的字符 '' -- 替换为空字符串 ) AS cleaned_text FROM your_table; ``` ### 关键说明 1. **正则表达式 `[^[:alnum:]\u4E00-\u9FA5]`**: - `[:alnum:]`:匹配所有字母(a-z, A-Z)和数字(0-9) - `\u4E00-\u9FA5`:匹配Unicode范围内的汉字(基本汉字区) - `[^...]`:反向匹配,即排除以上字符 2. **字符集要求**: - 数据库字符集需支持Unicode(如AL32UTF8) - 若包含扩展汉字(如生僻字),需扩展范围至`\u9FA6-\u9FFF` 3. **示例**: ```sql SELECT REGEXP_REPLACE('Hello 世界!123@数据', '[^[:alnum:]\u4E00-\u9FA5]', '') FROM DUAL; -- 返回:'Hello世界123数据' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值