如何创建一个自动递增的字符串?

3

我遇到了一个问题,需要将字符串增加为 01、02、……10、12。

  • 我有一个 SQL 查询,它给出了我的数据库中的最大值 AAAA06
  • 现在我有一个要求,每当用户调用此查询时,它将检查当前最大编号为 AAAA06(目前是最大值),并应返回或打印 AAAA07
  • 同样,当最大值为 AAAA09 时,它应该增加到 AAAA10 等等。
  • 作为一种语言,我正在使用 Java,但我想知道是否可以通过我的 SQL 查询本身来实现这一点,还是必须编写 Java 代码来实现这一点?

我正在使用的查询如下:

select max(code) from mt_users where maincode='AAAA'

由我来调用最大号码;我只想递增或连接任何东西以获得所需的输出。

它给出了 AAAA06,因为这是目前的最大值。

重要点

  1. 当最初为 AAAA 时,它应该显示 AAAA01
  2. 当它是 AAAA09 时,它应该显示 AAAA10
  3. 当它是 AAAA99 时,它将显示 AAAA100

注意: 目前我将最大值设为 AAAA06,但对于将来的新用户,它可能会变成 AAAE,因此我必须从 AAAE01 开始启动。


1
你似乎已经有了字段 mainode(顺便问一下,这是指“mainnode”还是“maincode”?),其中包含“AAAA”前缀。那么你不能只有一个数字字段,在访问时自动递增并返回两者的连接吗? - Thomas
@Thomas 我不知道如何实现那个。 - manish thakur
3
这种问题表明设计不佳(即前后颠倒)。 - Strawberry
@SalmanA,应该是AAAA99而不是AAA99..........它会显示AAAA100 - manish thakur
1
@munish 如果你使用这个方法,找到最大值会有麻烦。SELECT MAX(s) FROM (SELECT 'AAAA100' s UNION SELECT 'AAAA21') x 返回的是 AAAA21!!! - Salman A
显示剩余4条评论
2个回答

1
你可以使用 lpad
select case when code < 10 
            then concat( substring(maincode,1,4),lpad( max(code)+1 ,length(code+10),'0')) 
            else concat( substring(maincode,1,4),lpad( max(code)+1 ,length(code+1),'0')) 
            end
    as "Result String"
  from tab
 where maincode = 'AAAA01' -- 'AAAE';

根据我们之间的聊天,您需要以下逻辑:
select concat( substring(maincode,1,4), 
                     case when substring(maincode,5,length(maincode)-4) !=
                               substring(maincode,5,length(maincode)-4)+1
                     then
                         substring(maincode,5,length(maincode)-4)+1
                     else
                      lpad( 
                         substring(maincode,5,length(maincode)-4)+1,
                      length(maincode)-4,'0')
                     end
                )               
    as "Result String"
  from tab;

演示


先生,它输出了错误的结果。对于 AAAA06 它应该输出 AAAA0601 - manish thakur
@manishthakur 你确定吗,亲爱的朋友?请考虑一下演示。 - Barbaros Özhan
让我检查一下,先生。 - manish thakur
先生,当将主代码传递为 AAAA01 时,仍然显示为空值 :( - manish thakur
从问题的文本中,我理解有两个名为maincodecode的单独列,我的答案取决于这个逻辑。 - Barbaros Özhan
显示剩余4条评论

1
简短回答:使用以下查询:

SELECT id AS PrevID, CONCAT(
    SUBSTRING(id, 1, 4),
    IF(CAST(SUBSTRING(id, 5) AS UNSIGNED) <= 9, '0', ''),
    CAST(SUBSTRING(id, 5) AS UNSIGNED) + 1
) AS NextID
FROM (
    -- since you allow strings such as AAAA20 and AAAA100 you can no longer use MAX
    SELECT id
    FROM t
    ORDER BY SUBSTRING(id, 1, 4) DESC, CAST(SUBSTRING(id, 5) AS UNSIGNED) DESC
    LIMIT 1
) x

结果:

| PrevID  | NextID  | 
| AAAA100 | AAAA101 | 
| AAAA21  | AAAA22  | 
| AAAA06  | AAAA07  | 

为了好玩,我编写了这个存储过程,它生成的数字看起来像AAAA00 AAAA99 AAAB00等等:

CREATE FUNCTION NextID(PrevID VARCHAR(6))
RETURNS VARCHAR(6)
BEGIN
    DECLARE s VARCHAR(4);
    DECLARE i INT;
    DECLARE j INT;

    SET s = LEFT(PrevID, 4);
    SET s = REPLACE(s, 'A', '0');
    SET s = REPLACE(s, 'B', '1');
    SET s = REPLACE(s, 'C', '2');
    SET s = REPLACE(s, 'D', '3');
    SET s = REPLACE(s, 'E', '4');
    SET s = REPLACE(s, 'F', '5');
    SET s = REPLACE(s, 'G', '6');
    SET s = REPLACE(s, 'H', '7');
    SET s = REPLACE(s, 'I', '8');
    SET s = REPLACE(s, 'J', '9');
    SET s = REPLACE(s, 'K', 'A');
    SET s = REPLACE(s, 'L', 'B');
    SET s = REPLACE(s, 'M', 'C');
    SET s = REPLACE(s, 'N', 'D');
    SET s = REPLACE(s, 'O', 'E');
    SET s = REPLACE(s, 'P', 'F');
    SET s = REPLACE(s, 'Q', 'G');
    SET s = REPLACE(s, 'R', 'H');
    SET s = REPLACE(s, 'S', 'I');
    SET s = REPLACE(s, 'T', 'J');
    SET s = REPLACE(s, 'U', 'K');
    SET s = REPLACE(s, 'V', 'L');
    SET s = REPLACE(s, 'W', 'M');
    SET s = REPLACE(s, 'X', 'N');
    SET s = REPLACE(s, 'Y', 'O');
    SET s = REPLACE(s, 'Z', 'P');

    SET i = RIGHT(PrevID, 2);
    SET j = CONV(s, 26, 10);

    SET i = i + 1;
    IF i > 99 THEN
        SET i = 0;
        SET j = j + 1;
    END IF;

    SET s = CONV(j, 10, 26);
    SET s = REPLACE(s, 'P', 'Z');
    SET s = REPLACE(s, 'O', 'Y');
    SET s = REPLACE(s, 'N', 'X');
    SET s = REPLACE(s, 'M', 'W');
    SET s = REPLACE(s, 'L', 'V');
    SET s = REPLACE(s, 'K', 'U');
    SET s = REPLACE(s, 'J', 'T');
    SET s = REPLACE(s, 'I', 'S');
    SET s = REPLACE(s, 'H', 'R');
    SET s = REPLACE(s, 'G', 'Q');
    SET s = REPLACE(s, 'F', 'P');
    SET s = REPLACE(s, 'E', 'O');
    SET s = REPLACE(s, 'D', 'N');
    SET s = REPLACE(s, 'C', 'M');
    SET s = REPLACE(s, 'B', 'L');
    SET s = REPLACE(s, 'A', 'K');
    SET s = REPLACE(s, '9', 'J');
    SET s = REPLACE(s, '8', 'I');
    SET s = REPLACE(s, '7', 'H');
    SET s = REPLACE(s, '6', 'G');
    SET s = REPLACE(s, '5', 'F');
    SET s = REPLACE(s, '4', 'E');
    SET s = REPLACE(s, '3', 'D');
    SET s = REPLACE(s, '2', 'C');
    SET s = REPLACE(s, '1', 'B');
    SET s = REPLACE(s, '0', 'A');

    RETURN CONCAT(LPAD(s, 4, 'A'), LPAD(i, 2, '0'));
END

SELECT NextID('AAAA01') -- AAAA02
SELECT NextID('AAAA99') -- AAAB00
SELECT NextID('AAAB99') -- AAAC00
SELECT NextID('AAAZ99') -- AABA00

id/PrevID是包含字符串的列。NextID是基于先前ID生成的“生成”ID(仅用于演示)。 - Salman A
嘿,当出现 BBBB 时,它会给出 BBBB01 吗? - manish thakur
先生,我有一个非常小的问题..您有空的时候请在这里评论。 - manish thakur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接