最值问题引发的困扰

来源:这里教程网 时间:2026-03-03 15:49:02 作者:

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'。

相关推荐