快放假了,先祝大家长假愉快!
有个查询替换的问题,具体如下: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

解决方案 »

  1.   

    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修改为字段名
      

  2.   

    简单一点:
    SET @t='1111111abc1111111';
    SELECT REPLACE(@t,LEFT(REPLACE(@t,'abc',''),1),'*')
      

  3.   

    假设ABC两边的字符是相同的,如果不同,则:
    SET @t1='12343435abc23456u789';
    SELECT CONCAT(REPEAT('*',INSTR(@t1,'abc')-1),'abc',REPEAT('*',INSTR(REVERSE(@t1),'cba')-1))
      

  4.   


    大哥,你写的对你定义的@t是正确的,但不够健壮,随便修改修改@t的值,结果就不正确了
    比如:
     SET @t='我的SWQL程序,abcdedededededede,wodechengxu';
    帮我再看看纳,谢谢了!!
      

  5.   

    SET @t1='我的SWQL程序,abcdedededededede,wodechengxu';
    SELECT CONCAT(REPEAT('*',INSTR(@t1,'abc')-1),'abc',REPEAT('*',INSTR(REVERSE(@t1),'cba')-1))测试数据一定要有代表性
      

  6.   


    麻烦能给讲解一下吗?
    为什么abc后半句要翻转,如果abc是汉字要怎么处理?ps:
       其实,我是想实现,按照某关键字,从数据库中查找出来的内容结果中,只出现“用户输入的查找关键字”而其他全部使用*号代替。(因为内容结果中可能会有敏感字符串)。
       这样也就是说,上面的abc就是从查找控件传过来的变量,mysql中想实现这样的需求这么困难吗?
      

  7.   

    不用REVERSE要复杂一些:
    SELECT CONCAT(REPEAT('*',INSTR(@t1,'abc')-1),'abc',
    REPEAT('*',LENGTH(@t1)-(INSTR(@t1,'abc')+2)-(INSTR(@t1,'abc')-1)));
    MYSQL不支持正则替换
      

  8.   

    如果出现多处字串怎么办呢?如:abcwwwwwabcwwwwwabc,wwwwwabcwwwabc
    还有这种查找拼接组合的方式,效率怎么样呢?
      

  9.   

    举例子一定有代表性,否则一个问题解决后,你的回答只能是“哦,这不我想要的。”当然从你楼顶的题分析来说, “想把结果中‘非abc’的字符全部替换成‘***’” 你的也没问错。只不过是例子有些误导了别人。这种情况下,答案很确定,无法单纯用SQL语句和MYSQL的内建函数实现。 建议是在你输出程序中,比如PHP代码中去做REGEXP-REPLACE。如果一定要在数据库中实现,则可以自己写个存储函数。这个函数并不复杂。如果你能假设你的目标字符串 中肯定不会出现某个特定字符,比如肯定不出现$,则也可以通过辅助表和SQL语句来实现,但效率上并不高。
      

  10.   

    因为系统比较复杂,所以我简单的讲述了下需求,语言表述的不清楚,非常抱歉!功能分三部分:
    1,数据库
    2,查询页面
    3,查询结果列表页面    因为数据记录是系统的审计数据(就是在操作电脑时,你所有操作的键盘、复制、粘贴等字符数据,可想而知,这些数据肯定是没有什么规律的,它可能是任意字符),因此会有用户名密码之类的敏感数据,但是,我们又允许对这些审计数据查询(可以对内容模糊查询),只是希望在查询的结果中,用户只能看到ta自己输入的关键字,但不能看到完整的审计数据,从而达到数据的隐蔽性。
        
       不知道这么表述需求是否清楚。   2查询页面 往 3结果页面提交查询条件;3结果页面负责组织查询条件,调用后台类方法,获取审计数据。我想在调用类方法后,返回的结果集中就是已经替换好的(替换成***)数据集。(我们公司不允许使用存储过程,这是很BT的)。
       
       当然,我可以在结果返回后在列表页面进行处理和替换,只是我更希望代码写的更漂亮些罢了。如果真的没有更好的解决方案的话,也只好在程序中处理字符替换了。
       谢谢两位高人的不吝指点,特别是wwwwb的热心解答,再次谢谢!!