你该好好学习 2021-10-23 19:49 采纳率: 100%
浏览 1120
已结题

存储过程,计算一个字符串中每一个字母的数量,今晚有效

创建了一张表,如下
CREATE TABLE label_table (
company varchar(200) PRIMARY KEY ,
label varchar(255),
label_num varchar(255)
);
第一列插入内容举例为A,B,C
第二列插入内容为纯字母无规律字符串,例如'hjdk','dfdkldg'
插入时,两个参数需要一起提供,例如('A','gdhjk')
如果A不存在,则插入以上内容,如果表中已经存在主键A,则第二个字段追加在已有字段之后,
例如表中已经存在(A,dhk)
再插入(A,jd),则最终字段为(A,dhkjd)
所以存储过程需要提供两个输入参数
以下这句似乎能达到类似的效果,仅作参考
INSERT INTO label_table VALUES('B', 'dfg')
ON DUPLICATE KEY UPDATE label=concat(label,'dfg');
例如现在表中有了这么两行数据
A,tyutyt
B,werwe
那么我希望表中第三列这样显示
A,tyutyt,t3y2u1
B,werwe, w2e2r1
也就是第三列是第二列对每个字母数量的统计,格式不限,只需要统计出每个字母的数量即可

  • 写回答

4条回答 默认 最新

  • 广大菜鸟 2021-10-24 15:14
    关注

    可能是版本问题,前面的几位写的不错,但我的版本显示不了一些函数,我学习后也写了,希望对题主有帮助
    1、创建表格

    CREATE TABLE label_table (
        company varchar(200)PRIMARY KEY ,
        label varchar(255),
        label_num varchar(255)
    );
    

    2、定义存储过程

    delimiter $$
    drop procedure if exists  insert_update_table;
    create procedure insert_update_table(In in_company varchar(200), In in_label varchar(255)) 
    BEGIN
        declare selectedCOUNT int default 0;
        declare newLabel varchar(200) default '';
        declare oldLabel varchar(200);
        declare newLabelNum varchar(400);
        declare tmpStr varchar(200);
        declare newLabelCopy varchar(200);
        declare t int;    
        # 声明一个自定义的变量
        select count(*) into selectedCOUNT
        from label_table 
        where label_table.company=in_company;
        if (selectedCOUNT>0) then 
            select label into oldLabel
            from label_table 
            where label_table.company=in_company;
            set oldLabel =  IFNULL(oldLabel, '');
            set newLabel =  CONCAT(oldLabel , in_label);
        else 
            set newLabel =  in_label;
        end if;
        set newLabelNum = '';
        set newLabelCopy = newLabel;
        while length(newLabelCopy)>0 DO
            set tmpStr = left(newLabelCopy,1);
            set t = length(newLabelCopy)-length(replace(newLabelCopy,tmpStr,''));
            set newLabelNum =  CONCAT(newLabelNum , tmpStr , concat(t,''));
            set newLabelCopy = replace(newLabelCopy,tmpStr,'');     
        end while;
        if (selectedCOUNT>0) then 
            update label_table SET label=newLabel, label_num=newLabelNum  where company = in_company;
        else
            BEGIN
                insert into label_table(company,label,label_num) values(in_company,newLabel,newLabelNum);
            END;
        end if;
        COMMIT;
    END$$
    delimiter ;
    

    3. 测试,插入空字符串,相对应更新

    INSERT INTO label_table(company,label) VALUES('A', 'tyutyt');
    INSERT INTO label_table(company,label) VALUES('B', 'werwe');
    select * from label_table;
    call insert_update_table('a','');
    select * from label_table;
    call insert_update_table('b','');
    select * from label_table;
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月4日
  • 已采纳回答 10月27日
  • 赞助了问题酬金 10月23日
  • 创建了问题 10月23日

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?