暂无图片
分享
XQW
2019-12-25
关于mqsql的sql写法

实现用sql做字符串的替换问题,mysql?
我想实现用sql做字符串的替换
数据表如下
001,张三
002,李四
003,王五
004,赵子龙
005,张飞

在mysql数据库中的一个字段(info1)内容为: 张三|王五|张飞
我想通过sql语句,在另外一个字段(info2)中将info1的内容转换成:001|003|005

收藏
分享
7条回答
默认
最新
lastwinner

你所述的功能如果用一条SQL去实现,那么需要具备递归功能的SQL才能完成,而MySQL在 8.0上才开始支持,请问你的MySQL版本是什么?

暂无图片 评论
暂无图片 有用 0
XQW

您好,感谢您的回复,
我的mysql就是8.0版本,请问如何写sql呢?十分感谢!

暂无图片 评论
暂无图片 有用 0
XQW

select wechatid,Aname from name1 where Aname in (select wechat from pos where id=3)

select wechatid,Aname from name1 where Aname in (‘丙’,‘赵云’,‘张飞’)

上面的两条语句的区别是什么,第一条查询不出数据,
第二条可以的。

暂无图片 评论
暂无图片 有用 0
lastwinner

纯从写法上来看,是不是字段你没写对?
select wechatid,Aname from name1 where Aname in (select Aname from pos where id=3)

暂无图片 评论
暂无图片 有用 0
lastwinner

CTE的写法如下,我这个是Oracle版本的
with t1 as
(select ‘001’ n,‘张三’ s from dual union all
select ‘002’,‘李四’ from dual union all
select ‘003’,‘王五’ from dual union all
select ‘004’,‘赵子龙’ from dual union all
select ‘005’,‘张飞’ from dual)
, t as
(select n, s, rank()over(order by n) rk from t1)
,u as
(select ‘张三|王五|张飞’ info1 from dual)
,cte_replace(id, info2, n1,s1) as
(select 0 id, info1, ‘null’ , ‘nulll’ from u
union all
select id+1, replace(info2,s,n ) info2, n, s from t,cte_replace c
where c.id<(select count(*) from t)
and t.rk=id+1)
select * from cte_replace;
查询结果如下:
————————————————————————————————————————————
ID INFO2 N1 S1


     0 张三|王五|张飞  null     nulll
     1 001|王五|张飞   001      张三
     2 001|王五|张飞   002      李四
     3 001|003|张飞    003      王五
     4 001|003|张飞    004      赵子龙
     5 001|003|005     005      张飞

对于mysql来说,
cte_replace(id, info2, n1,s1) as
改为
RECURSIVE cte_replace(id, info2, n1,s1) as
应该就可以,你试一下

暂无图片 评论
暂无图片 有用 0
XQW

谢谢专家花时间回复我,十分感谢!

暂无图片 评论
暂无图片 有用 0
XQW
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏