PostgreSQL中获取字母数字格式Item_code列最大值的函数问题
问题原因
你遇到的问题是因为字符串的字典序排序和数字大小排序逻辑不一致。PostgreSQL对text类型的MAX()函数是按字符的ASCII值逐位比较:
- 'RAM-9'和'RAM-15'比较时,前4个字符'RAM-'是相同的,第5位字符'9'的ASCII值(57)大于'1'(49),所以字典序里'RAM-9'比'RAM-15'大,导致
MAX()返回错误结果。
修正方案
需要把item_code中的数字部分提取出来转为整数,基于数字大小取最大值后,再拼接前缀返回。修改后的函数如下:
CREATE OR REPLACE FUNCTION public.get_last_itemcode( item text ) RETURNS text LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ declare result text; BEGIN SELECT CONCAT( SPLIT_PART(it.item_code, '-', 1), '-', MAX(CAST(SPLIT_PART(it.item_code, '-', 2) AS INTEGER)) ) INTO result FROM public.items as it WHERE it.item_name = item; RETURN result; END; $BODY$;
关键步骤解释
SPLIT_PART(it.item_code, '-', 1):拆分item_code,取'-'分隔的第一部分(比如'RAM')作为前缀CAST(SPLIT_PART(it.item_code, '-', 2) AS INTEGER):拆分出数字部分并转为整数,这样就能按数字大小排序MAX(...):基于整数类型取最大的数字值CONCAT(...):把前缀和最大数字重新拼接成'RAM-XX'格式的字符串
如果你的item_code前缀可能不固定(比如还有'CPU-1'这类),上面的逻辑依然适用,因为会自动提取对应行的前缀。
内容的提问来源于stack exchange,提问作者Ritik Rajvanshi
相关产品推荐
相关产品推荐

