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

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

创建了一张表,如下
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 关于PLUS模型中kapaa值的问题
  • ¥15 关于博途V17进行仿真时无法建立连接问题
  • ¥15 请问下这个红框里面是什么文档或者记事本编辑器
  • ¥15 机器学习教材中的例题询问
  • ¥15 求.net core 几款免费的pdf编辑器
  • ¥15 为什么安装HCL 和virtualbox之后没有找到VirtualBoxHost-OnlyNetWork?
  • ¥15 C# P/Invoke的效率问题
  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号