浙江省委宣传部副部长、省委网信办主任赵磊:守正创新 辩证施策 全力推动网络生态治理工作迈上新台阶
2026-02-10
美创产品全面入围中直机关2025年网络设备框架协议采购项目
2026-02-04
连续5年!美创再获中国网络安全产业联盟“先进会员单位”表彰
2026-01-21
每周安全速递³⁷¹ | 勒索软件攻击导致心理健康机构超11万人数据泄露
2026-01-06
四年同行,韧性共铸:西南某商行携手美创科技再度通过年度容灾大考
2025-12-26
存储域
数据库加密 诺亚防勒索访问域
数据库防水坝 数据库防火墙 数据库安全审计 动态脱敏流动域
静态脱敏 数据水印 API审计 API防控 医疗防统方运维服务
数据库运维服务 中间件运维服务 国产信创改造服务 驻场运维服务 供数服务安全咨询服务
数据出境安全治理服务 数据安全能力评估认证服务 数据安全风险评估服务 数据安全治理咨询服务 数据分类分级咨询服务 个人信息风险评估服务 数据安全检查服务最近呢,客户提上来一个问题。
“XX工,我在写条sql啊,按照年龄大小取值,比如60岁到80岁的,怎么查出来不对呢?”
“给我看看你的结果图呗。”
“好,发你了,你看下。”
我一瞅,咦,确实没对哦,结果集里面怎么还有7岁的。
“你把写的sql发我看看?”
我再一瞅,恩,原因找到了。
例子如下:
select * from age>’60岁‘ and age<’80岁’;
age这一列是字符串列,客户直接字符串比大小,字符串能比大小吗?
直接抛答案,答案是可以的,但是并不是这样比的。
简单来说,字符的比较按照第一个字符比,如果第一个字符相等,那么就比较第二个字符,需要注意的是,字符转化成的一个ASCII码作为大小比较的依据。
有点迷糊?

我们来测试看看。
我们来看看,字符串的排序顺序是什么。咱先创建个表。
SQL> create table test_x(age varchar2(10));
如下插入并查询,desc表示降序排序


可以看到,从上到下,大小依次排列,依据就是下图中的转化码。


所以,看明白了吗??
那么客户的问题就很好理解了,如下图:
创建一个test_x表进行测试:
create table test_x (name varchar2(20));

可以看到 81岁 > 7岁> 61岁,完美的复现客户的问题。
那么问题来了,如何解决客户的问题呢?
在一般客户环境中,大多数是这种情况,数字+单位组成的字符,所以呢,只要将数字提取出来,然后转化成数字比较大小就OK了。思路就是这样!
如何实现,请看:
第一步:仅保留数字 regexp_substr
REGEXP_INSTR函数是oracle中的正则表达式,可以输出你想获得的字符串格式。
语法如下:
REGEXP_SUBSTR(source_char, pattern `, position `, occurrence `, match_parameter ```)
source_char表示初始字符段
pattern 表示你确定的规则
如:
d 匹配一个数字字符。* 匹配零个或多个。+ 匹配一个或多个出现。. 匹配任何字符,除了空。等等,在此不一一例举。
后面的position、occurrence等都可以忽略,再次就不列举。
我们来看看常用的用法,如何保留字段中的数字,如下图,保留了数字。

回到客户的例子,如下,先将字符串中的字符去掉,只留下数字,如下,81>7>61 ,作为字符,排序还是异常的。

第二步:转化成number格式to_number()
to_number()函数可以将char或varchar2类型的string转换为一个number类型的数值。


可以看到,这一列的值,终于按照正常的数值大小排序了!
至此,该问题完美解决,总结一下,比较大小的时候,千万要注意看字段的类型,有的虽然表面看起来只有数字,但是实际上可能是varchar2()或其他字符字段(小编真实的环境中见过几次,这种设计绝对不够合理)!
此外呢,oracle正则表达式函数除了regexp_substr之外,还有regexp_like , regexp_replace等等,有兴趣的小伙伴可以慢慢了解。我们下期再见!
