V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
namaste
V2EX  ›  问与答

请教一个能否用 sql 快速解决的办法

  •  
  •   namaste · 2020-09-28 10:40:56 +08:00 · 1236 次点击
    这是一个创建于 1278 天前的主题,其中的信息可能已经有所发展或是发生改变。
    遇到这样一个问题,表中有一堆卡号,给出的字段有起始卡号,终止卡号,卡是否发掉。号段都是按整数连续的
    举例
    begin_no | end_no | flag
    6666×××01,6666×××05,11122
    6667×××88,6667×××90,121
    .
    .
    .
    6668×××20,6668×××25,112121

    其中 1 是在库,2 是发掉了的

    有没有直接能几句 sql,去除发掉的卡,按连续卡一行的形式呈现

    想要的结果:

    begin_no | end_no | flag
    6666×××01,6666×××03,111
    6667×××88,6667×××88,1
    6667×××90,6667×××90,1
    .
    .
    .
    6668×××20,6668×××21,11
    6668×××23,6668×××23,1
    6668×××25,6668×××25,1
    11 条回复    2020-09-28 14:21:18 +08:00
    jazzychai
        1
    jazzychai  
       2020-09-28 11:05:12 +08:00
    估计得循环一遍...
    namaste
        2
    namaste  
    OP
       2020-09-28 11:15:57 +08:00
    有优雅点的办法吗?没有的话准备导出数据 golang 处理了
    namaste
        3
    namaste  
    OP
       2020-09-28 11:18:28 +08:00
    建个中间表,存下所有卡号跟对应 flag,去掉 flag=2 的,再汇总也是个办法。不过好麻烦,有没有直接能 select 出来的方法
    whisper3032
        4
    whisper3032  
       2020-09-28 11:21:00 +08:00
    这个记录方式就不优雅呀,为啥不是一张卡一行,就为了节省几行空间嘛
    ApachW
        5
    ApachW  
       2020-09-28 11:30:38 +08:00
    可是可以
    ticotic
        6
    ticotic  
       2020-09-28 12:14:33 +08:00
    游标+文本处理函数?
    ticotic
        7
    ticotic  
       2020-09-28 12:30:30 +08:00
    update card set flag=replace("2","");

    如果 flag 是字符串类型的话,试验了下可以有这个效果
    ticotic
        8
    ticotic  
       2020-09-28 12:31:22 +08:00
    语句错了,是这个

    update card set flag=replace(flag,"2", "");

    楼主可以先自建个表先试试
    netnr
        9
    netnr  
       2020-09-28 12:39:51 +08:00
    写逻辑 SQL,遍历 flag,等于 1 取索引对应的号码,得出一列,全是在库,但不是连续的:
    6666×××01
    6666×××02
    6666×××88
    6666×××89
    再想办法合并连续的号码
    ticotic
        10
    ticotic  
       2020-09-28 12:55:06 +08:00
    会错意了,那还是 mysql 游标 内加循环判断再 insert 到新表里应该可以实现,感觉写起来也很麻烦,不必程序里简单

    而且新表还是依旧连续卡号,以后还是会出现其中一些卡又被发掉的情况,容易形成 数据页空洞 和现在遇到的情况吧?
    namaste
        11
    namaste  
    OP
       2020-09-28 14:21:18 +08:00
    感谢大家给的思路,我用了二分法,结合 locate 跟 posstr 函数。建了两张中间表相互 insert,搞定了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2781 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:20 · PVG 20:20 · LAX 05:20 · JFK 08:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.