Mysql中查询结果字符替换-----请教高手

kejzhao 2010-09-30 03:57:33
快放假了,先祝大家长假愉快!
有个查询替换的问题,具体如下:

select title from table01 where 1=1

结果:
1111111abc1111111
2222222abc2222222
3333333abc3333333
WWWWWWWabcWWWWWWW
QQQQQQQabcQQQQQQQ

现在我想使用replace函数进行替换,想把结果中‘非abc’的字符全部替换成‘***’
我想使用regexp_replace(title,[^abc],'***')函数的,好像mysql中不支持该函数,有其他好的方法吗?

附:使用replace函数 我没有搞出来,请家教高手!!不胜感激!!
select replace(title,'abc','***') from table01 where 1=1
...全文
761 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-09-30
  • 打赏
  • 举报
回复
那还在程序中实现比较好。

我也不建议用存储过程,存储过程的存在本身就是破坏这个软件系统的构架。数据库做好数据存储就行,不需要去实现业务上的东西。否则一但数据库迁移,会有很多麻烦。 你公司的决定是完全正确的。
kejzhao 2010-09-30
  • 打赏
  • 举报
回复
因为系统比较复杂,所以我简单的讲述了下需求,语言表述的不清楚,非常抱歉!

功能分三部分:
1,数据库
2,查询页面
3,查询结果列表页面

因为数据记录是系统的审计数据(就是在操作电脑时,你所有操作的键盘、复制、粘贴等字符数据,可想而知,这些数据肯定是没有什么规律的,它可能是任意字符),因此会有用户名密码之类的敏感数据,但是,我们又允许对这些审计数据查询(可以对内容模糊查询),只是希望在查询的结果中,用户只能看到ta自己输入的关键字,但不能看到完整的审计数据,从而达到数据的隐蔽性。

不知道这么表述需求是否清楚。

2查询页面 往 3结果页面提交查询条件;3结果页面负责组织查询条件,调用后台类方法,获取审计数据。我想在调用类方法后,返回的结果集中就是已经替换好的(替换成***)数据集。(我们公司不允许使用存储过程,这是很BT的)。

当然,我可以在结果返回后在列表页面进行处理和替换,只是我更希望代码写的更漂亮些罢了。如果真的没有更好的解决方案的话,也只好在程序中处理字符替换了。


谢谢两位高人的不吝指点,特别是wwwwb的热心解答,再次谢谢!!
ACMAIN_CHM 2010-09-30
  • 打赏
  • 举报
回复
[Quote]如果出现多处字串怎么办呢?如:abcwwwwwabcwwwwwabc,wwwwwabcwwwabc
还有这种查找拼接组合的方式,效率怎么样呢?[/Quote]举例子一定有代表性,否则一个问题解决后,你的回答只能是“哦,这不我想要的。”

当然从你楼顶的题分析来说, “想把结果中‘非abc’的字符全部替换成‘***’” 你的也没问错。只不过是例子有些误导了别人。

这种情况下,答案很确定,无法单纯用SQL语句和MYSQL的内建函数实现。 建议是在你输出程序中,比如PHP代码中去做REGEXP-REPLACE。如果一定要在数据库中实现,则可以自己写个存储函数。这个函数并不复杂。

如果你能假设你的目标字符串 中肯定不会出现某个特定字符,比如肯定不出现$,则也可以通过辅助表和SQL语句来实现,但效率上并不高。
kejzhao 2010-09-30
  • 打赏
  • 举报
回复
如果出现多处字串怎么办呢?如:abcwwwwwabcwwwwwabc,wwwwwabcwwwabc
还有这种查找拼接组合的方式,效率怎么样呢?

wwwwb 2010-09-30
  • 打赏
  • 举报
回复
不用REVERSE要复杂一些:
SELECT CONCAT(REPEAT('*',INSTR(@t1,'abc')-1),'abc',
REPEAT('*',LENGTH(@t1)-(INSTR(@t1,'abc')+2)-(INSTR(@t1,'abc')-1)));
MYSQL不支持正则替换
kejzhao 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wwwwb 的回复:]
SET @t1='我的SWQL程序,abcdedededededede,wodechengxu';
SELECT CONCAT(REPEAT('*',INSTR(@t1,'abc')-1),'abc',REPEAT('*',INSTR(REVERSE(@t1),'cba')-1))

测试数据一定要有代表性
[/Quote]

麻烦能给讲解一下吗?
为什么abc后半句要翻转,如果abc是汉字要怎么处理?

ps:
其实,我是想实现,按照某关键字,从数据库中查找出来的内容结果中,只出现“用户输入的查找关键字”而其他全部使用*号代替。(因为内容结果中可能会有敏感字符串)。
这样也就是说,上面的abc就是从查找控件传过来的变量,mysql中想实现这样的需求这么困难吗?
wwwwb 2010-09-30
  • 打赏
  • 举报
回复
SET @t1='我的SWQL程序,abcdedededededede,wodechengxu';
SELECT CONCAT(REPEAT('*',INSTR(@t1,'abc')-1),'abc',REPEAT('*',INSTR(REVERSE(@t1),'cba')-1))

测试数据一定要有代表性
kejzhao 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]
SET @t='1111111abc1111111';
SELECT CONCAT(REPLACE(LEFT(@t,INSTR(@t,'abc')-1),LEFT(@t,1),'*'),'abc',
REPLACE(RIGHT(@t,INSTR(@t,'abc')-1),MID(@t,INSTR(@t,'abc')+4,1),'*'))

将@T修改为字段名
[/Quote]

大哥,你写的对你定义的@t是正确的,但不够健壮,随便修改修改@t的值,结果就不正确了
比如:
SET @t='我的SWQL程序,abcdedededededede,wodechengxu';
帮我再看看纳,谢谢了!!
wwwwb 2010-09-30
  • 打赏
  • 举报
回复
假设ABC两边的字符是相同的,如果不同,则:
SET @t1='12343435abc23456u789';
SELECT CONCAT(REPEAT('*',INSTR(@t1,'abc')-1),'abc',REPEAT('*',INSTR(REVERSE(@t1),'cba')-1))
wwwwb 2010-09-30
  • 打赏
  • 举报
回复
简单一点:
SET @t='1111111abc1111111';
SELECT REPLACE(@t,LEFT(REPLACE(@t,'abc',''),1),'*')
wwwwb 2010-09-30
  • 打赏
  • 举报
回复
SET @t='1111111abc1111111';
SELECT CONCAT(REPLACE(LEFT(@t,INSTR(@t,'abc')-1),LEFT(@t,1),'*'),'abc',
REPLACE(RIGHT(@t,INSTR(@t,'abc')-1),MID(@t,INSTR(@t,'abc')+4,1),'*'))

将@T修改为字段名

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧