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

2020-09-28 10:40:56 +08:00
 namaste
遇到这样一个问题,表中有一堆卡号,给出的字段有起始卡号,终止卡号,卡是否发掉。号段都是按整数连续的
举例
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
1284 次点击
所在节点    问与答
11 条回复
jazzychai
2020-09-28 11:05:12 +08:00
估计得循环一遍...
namaste
2020-09-28 11:15:57 +08:00
有优雅点的办法吗?没有的话准备导出数据 golang 处理了
namaste
2020-09-28 11:18:28 +08:00
建个中间表,存下所有卡号跟对应 flag,去掉 flag=2 的,再汇总也是个办法。不过好麻烦,有没有直接能 select 出来的方法
whisper3032
2020-09-28 11:21:00 +08:00
这个记录方式就不优雅呀,为啥不是一张卡一行,就为了节省几行空间嘛
ApachW
2020-09-28 11:30:38 +08:00
可是可以
ticotic
2020-09-28 12:14:33 +08:00
游标+文本处理函数?
ticotic
2020-09-28 12:30:30 +08:00
update card set flag=replace("2","");

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

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

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

而且新表还是依旧连续卡号,以后还是会出现其中一些卡又被发掉的情况,容易形成 数据页空洞 和现在遇到的情况吧?
namaste
2020-09-28 14:21:18 +08:00
感谢大家给的思路,我用了二分法,结合 locate 跟 posstr 函数。建了两张中间表相互 insert,搞定了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/711170

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX