ITPub博客

首页 > 数据库 > Oracle > 最值问题引发的困扰

最值问题引发的困扰

原创 Oracle 作者:to_be_Dba 时间:2020-06-11 15:27:23 0 删除 编辑

SQL> select min(pid),max(pid),count(1),count(distinct pid) from TB_WOPAY_RSA;

MIN(PID)   MAX(PID)     COUNT(1) COUNT(DISTINCTPID)

---------- ---------- ---------- ------------------

0          999999        5000000            5000000


SQL> desc  TB_WOPAY_RSA

Name       Type           Nullable Default Comments    

---------- -------------- -------- ------- ----------- 

PID        VARCHAR2(10)                                

PUBLICKEY  VARCHAR2(1024) Y                Public key  

PRIVATEKEY VARCHAR2(1024) Y                Private key

CREATEDATE DATE           Y                Create date 


pid是表的主键,但最大值和最小值的差却小于数据量,这是怎么回事呢?


你可能会猜想:

该字段是varchar2数据类型,里面可能包含非数字字符。

但是下面查询结果是空的:


select * from TB_WOPAY_RSA where not regexp_like (pid, '^(+|[0-9]+)$');



还有什么其他想法吗?


看看下面的查询结果你就明白了:


SQL> select min(pid),max(pid+0),count(1),count(distinct pid) from wappay.TB_WOPAY_RSA;

MIN(PID)   MAX(PID+0)   COUNT(1) COUNT(DISTINCTPID)

---------- ---------- ---------- ------------------

0             4999999    5000000            5000000


是的,造成上面困扰的原因是查询时我们潜意识将pid转化为数字进行大小比较了。而max、min针对varchar2的大小比较是“逐位进行”的,

作为数字,4999999 > 999999

但字符串是逐位比较的,'999999' > '4999999',因为用第一位做比较时,'9'>'4'。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26451536/viewspace-2697673/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-11-23

  • 博文量
    170
  • 访问量
    484898