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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:27:08