oracle 过滤字段中的中文,不再洋不洋土不土

简介: oracle 过滤字段中的中文,不再洋不洋土不土

前言:


       随着数字化建设的不断深入,企业越来越注重,企业数据治理,通过数据消费来辅助决策。作为全球新能源行业综合服务商。我们企业也遇到了很多特殊的业务。当然每个企业都会遇到业务数字化后,总会留些口子来处理 一些“费力不讨好的业务”。即业务量很小,标准化管控不值当。当然这些业务也会被完整纳入线上化,麻雀虽小,五脏俱全。这就导致了,在综合业务分析时发现,一些很讨厌的“异常数据”如批次中带有中文之类的。今天和大家来分享,怎么处理这些中文+英文的“洋土批次”。总结在任何企业都适用的中文处理。


一、知己知彼


       中文为啥会存在?


1.1业务场景


       如上图所示,有些自定义的业务批次的批号不是系统自动生成的,而是通过手工录入系统中,虽然有说一定的制度约束,但是为了方便查看对应含义,不可避免加入了汉字。在网上查看了很多关于过滤中文的SQ说实话,差点意思,基本都不能满足需求,因此想系统整理来避免浪费大家的时间,也可以在自己需要时随时查看~


1.2错误案例


错误示例

select *
from table_name
where regexp_like(text_field, '[\u4E00-\u9FA5]');

错误诠释


       上面的代码使用regexp_like函数,通过指定字符unicode值范围,从而实现过滤中文字符的功能,其中unicode值按照中文汉字的范围设置,\u4E00 – \u9FA5是中文汉字 unicode编码表中最常用的字符范围,一般情况下即可满足需求。


错误效果示例


如下图所示最后出来的批次和没过滤是一样的。

原因分析


具体原因,可以参考我以前写的文章说明,在oracle我们不能根据unicode范围来过滤中文。

oracle替换字符串中的中文_oracle去除字符串中的汉字_他们叫我技术总监的博客-CSDN博客


二、思路整理


2.1存储长度与字符串长度比较


中文在oracle 数据库存储时,一个中文会占用两个字符以上。具体要看数据库的字符集编码。一般情况下,数据库的NLS_CHARACTERSET 为AL32UTF8或UTF8,即一个汉字占用三到四个字节。如果NLS_CHARACTERSET为ZHS16GBK,则一个中文占用两个字节。

如上图所示一个中文占用了2个字节。


因此我们就可以使用第一种办法啦,就是通过lengthb('中文')!=length('中文')来找到,包含中文的批号啦。正确示例案例如下图所示


代码:

--查询带中文的数据
 select 生产批次号   from   BI.QZ_zB_GCPJCSJ zb  
          where 1=1 
          and flag='已清洗'
          and LENGTH(生产批次号)!= LENGTHB(生产批次号);--查询中文批次
--查询非中文的数据
 select 生产批次号   from   BI.QZ_zB_GCPJCSJ zb  
          where 1=1 
          and flag='已清洗'
          and LENGTH(生产批次号)= LENGTHB(生产批次号);--查询非中文批次

效果:

诠释:


如上图所示,通过LENGTH(生产批次号)!= LENGTHB(生产批次号)就能找到包含中文的批次了。因此我们如果只想看非中文的批次,我们使用LENGTH(生产批次号)= LENGTHB(生产批次号)就能达到目的啦,是不是非常简单。


三、还有没有其他思路


在上面我们使用中文的存储规则来过滤中文数据,其实我们还可以利用ascii表的规则来查询中文数据。


3.1ascii表查找法


批次规则一般包括数字、字母、特殊符号和汉字,去掉ascii表里面没有的字符不就是中文了。详情可参考对应ascii表。

  具体我们将中文替换成一个不会出现的复杂字符串,如“他们叫我技术总监”如果判定替换后的字符串是否包含“他们叫我技术总监”的字符即可。详情看下面案例。


3.2正式案例


代码:

    select 生产批次号
            from BI.QZ_ZB_GCPJCSJ
           where instr(regexp_replace(生产批次号,
                                      '[' || chr(128) || '-' || chr(255) || ']',
                                      '他们叫我技术总监'),
                       '他们叫我技术总监',
                       1,
                       1) > 0
--将中文替换为一个不可能出现的字符,然后判断替换的字符串是否包含对应的字符

效果:

诠释:


我们将中文替换成一个不会出现的复杂字符串,然后再判定替换后的字符串是否包含替换后的字符即可。对应替换后的字符串是中文即可。


四、总结


       在本次文章中,包含了常用所有的中文处理方案,如查找包含中文的数据、查找非中文的数据,将中文替换成其他字符等。当然我们有时候还需要在一堆包含中文的字符串中获取数字、日期等。如“2.2元/斤”,获取2.2作为单价。如“2023-06-22我们在一起”获取2023-06-22的日期用来分析。对应处理方法我在往前做了文章说明,希望对大家有用,不再去网上浪费时间搜索错误的教程了~


相关文章
|
2月前
|
SQL Oracle 关系型数据库
Oracle 将表中的数据查出更改某一字段的值后再插入该表
Oracle 将表中的数据查出更改某一字段的值后再插入该表
32 2
|
4月前
|
SQL Oracle 关系型数据库
Oracle之如何限制字段内数据的录入
Oracle之如何限制字段内数据的录入
42 0
|
SQL Oracle 关系型数据库
Oracle 统计某个字段下不同值的个数
Oracle 统计某个字段下不同值的个数
|
2月前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
8月前
|
Oracle 关系型数据库
Oracle 根据某个字段获取第一条数据
Oracle 根据某个字段获取第一条数据
|
8月前
|
存储 Oracle 关系型数据库
Oracle——根据拼音首字母模糊查询某个字段
Oracle——根据拼音首字母模糊查询某个字段
|
8月前
|
Oracle 关系型数据库 数据库
Oracle——给数据库的某个字段设置随机数
Oracle——给数据库的某个字段设置随机数
|
11月前
|
Oracle 关系型数据库
常用oracle语句-查看表注释表的字段以及注释
常用oracle语句-查看表注释表的字段以及注释
|
11月前
|
SQL Oracle 关系型数据库
Oracle增加修改删除字段/主键
Oracle增加修改删除字段/主键
76 0

相关实验场景

更多

推荐镜像

更多