You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询MAX函数失效:如何获取per_all_people_f表的最大数字型person_number

解决字符串类型数字字段取最大值的问题

你的问题核心在于直接对字符串类型的person_number取MAX时,数据库是按字符串字典序排序,而非数值大小。举个实际例子:字符串"98098"和"1503388"比较时,第一个字符'9'的ASCII码比'1'大,所以字符串层面"98098"会被判定为更大,但数值上1503388明显更大;如果是负数字符串比如"-1503388",由于开头的'-'ASCII码比数字小,会排在所有正数字符串前面,自然不会被当成最大值(不过数值上它确实比正数小,除非你的场景里全是负数)。

要得到正确的数值最大值,你需要做两步调整:

  1. 修正正则表达式,确保能匹配带负号的数字(如果数据里存在负数的话);
  2. 将符合格式的字符串转换为数值类型后再取MAX。

修改后的查询语句如下:

SELECT MAX(TO_NUMBER(person_number)) 
FROM per_all_people_f 
WHERE REGEXP_LIKE(person_number, '^-?[[:digit:]]+$');

关键细节说明:

  • ^-?[[:digit:]]+$:正则里的-?表示负号是可选的,这样既能匹配正数(比如"98098"),也能匹配负数(比如"-1503388");
  • TO_NUMBER(person_number):把字符串类型的数字转换为数值类型,让数据库按照数值大小排序计算MAX;
  • 原查询里的DISTINCT其实可以省略,因为MAX本身会自动忽略重复值,若业务确实需要去重,也可以写成MAX(DISTINCT TO_NUMBER(person_number))。

这样调整后,就能得到真正意义上的数值最大值了。

内容的提问来源于stack exchange,提问作者SSA_Tech124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:46