SQL查询MAX函数失效:如何获取per_all_people_f表的最大数字型person_number
解决字符串类型数字字段取最大值的问题
你的问题核心在于直接对字符串类型的person_number取MAX时,数据库是按字符串字典序排序,而非数值大小。举个实际例子:字符串"98098"和"1503388"比较时,第一个字符'9'的ASCII码比'1'大,所以字符串层面"98098"会被判定为更大,但数值上1503388明显更大;如果是负数字符串比如"-1503388",由于开头的'-'ASCII码比数字小,会排在所有正数字符串前面,自然不会被当成最大值(不过数值上它确实比正数小,除非你的场景里全是负数)。
要得到正确的数值最大值,你需要做两步调整:
- 修正正则表达式,确保能匹配带负号的数字(如果数据里存在负数的话);
- 将符合格式的字符串转换为数值类型后再取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
相关产品推荐
相关产品推荐

