【问题标题】:Hide characters in email address using an SQL query使用 SQL 查询隐藏电子邮件地址中的字符
【发布时间】:2016-11-24 18:09:05
【问题描述】:

我有一个非常具体的业务需求,即在从 SQL 返回时隐藏电子邮件地址中的某些字符,而我已经达到了 SQL 实现这一目标的能力极限。我想知道是否有人能指出我正确的方向。从本质上讲,我的业务要求如下:

test@email.com 变成 t*\*t@e**l.com

thislong@emailaddress.com 变成 t******h@e**********s.com

我知道如果电子邮件之前或之后的任何部分都少于 3 个字符,那么这将不起作用,但我打算检查并适当地处理它。我尝试了 SUBSTRING、STUFF、LEFT/RIGHT 等的混合,但我不能完全正确。

【问题讨论】:

  • 您使用的是哪个 DBMS?不同数据库产品之间的字符串函数差异很大
  • 我正在尝试在 MS SQL 中执行此操作。我可以在服务器端进行替换,但是我试图在数据返回之前对其进行清理。我想在这种情况下,做服务器端会更合适。

标签: sql sql-server substring


【解决方案1】:
DECLARE @String VARCHAR(100) = 'example@gmail.com'

SELECT  LEFT(@String, 1) + '*****@' 
+ REVERSE(LEFT(RIGHT(REVERSE(@String) , CHARINDEX('@', @String) +1), 1))
+ '******'
+ RIGHT(@String, 5)

结果将是 e******e@g***l.com

【讨论】:

    【解决方案2】:

    非常有趣且很难生成通用解决方案试试这个

    这可能对你有帮助

    DECLARE @String VARCHAR(100) = 'sample@gmail.com'
    
    SELECT STUFF(STUFF(@STring,
                       CHARINDEX('@',@String)+2,
                       (CHARINDEX('.',@String, CHARINDEX('@',@String))-CHARINDEX('@',@String)-3),
                       REPLICATE('*',CHARINDEX('.',@String, CHARINDEX('@',@String))-CHARINDEX('@',@String)))
                   ,2
                   ,CHARINDEX('@',@String)-3
                   ,REPLICATE('*',CHARINDEX('@',@String)-3))
    

    输出将是

    s****e@g******l.com
    

    thislong@emailaddress.com 的类似方式

    输出将是

    t******g@e*************s.com
    

    【讨论】:

    • 太棒了!我可以把它包装成一个简洁的小函数。非常感谢您的帮助。
    • 如果您要将其包装到函数中,则将 CHARINDEX('@',@String) 存储到一个变量中并使用它,这也将提高性能。
    【解决方案3】:

    您也可以使用正则表达式。像这样(未完全完成):

    select regexp_replace('test@email.com', '^(.?).*@(.?).*', '\1***@\2***')
    from dual
    

    结果:

    t***@e***
    

    如果您只能使用 SELECT 语句,这可能是一个有用的解决方案。

    【讨论】:

      【解决方案4】:
      CREATE FUNCTION dbo.EmailObfuscate 
         (  @Email VARCHAR(255)
         )  RETURNS TABLE  AS RETURN
         (   
         SELECT      adr.email
                   ,  LEFT (adr.email, 1) 
                   +  REPLICATE ('*',  AtPos-3) 
                   +  SUBSTRING (adr.Email, AtPos-1, 3) 
                   +  REPLICATE ('*', Length-DotPos - AtPos - 2)
                   +  SUBSTRING (adr.Email, Length - DotPos, 10)  AS hide
          FROM        ( VALUES ( @Email) ) AS ADR (EMail)     
          CROSS APPLY ( SELECT    CHARINDEX ('@', adr.Email)
                               ,  CHARINDEX ('.', REVERSE(Adr.Email))
                               ,  LEN (Adr.Email)
                      ) positions (  AtPos
                                  ,  dotpos
                                  ,  Length
                                  ) 
         );
      GO
      -- Calling
      SELECT         Emails.* 
      FROM         ( Values (  'this.long@emailaddress.com')
                         ,  (  'test@email.com'            )
                         ,  (  'sample@gmail.com'          )
                         ,  (  'test@gmx.de'               )
                   ) AS     adr (email)
      CROSS APPLY    dbo.EmailObfuscate (Adr.Email) AS Emails
      

      【讨论】:

        【解决方案5】:
           SELECT 
           -- Email here is the name of the selected Column from your Table
           --Display the First Character
           SUBSTRING(Email,1,1)+
           --Replace selected Number of * 
           REPLICATE('*',10)+
           --Display the One Character before @ along with @ & One Character after @
           SUBSTRING(Email,CHARINDEX('@',Email)-1,3)+
           --Replace selected Number of * 
           REPLICATE('*',10)+
           --Display. Character along with the rest selected Number of Characters
           SUBSTRING(Email,CHARINDEX('.',Email)-1, LEN(Email) - 
           CHARINDEX('.',Email)+12) 
           --NameEmail is the Table Name      
           FROM NameEmail
        

        结果是:

        j**********l@a**********a.co.uk

        【讨论】:

          猜你喜欢
          • 2018-10-21
          • 1970-01-01
          • 2017-05-10
          • 1970-01-01
          • 1970-01-01
          • 2016-01-21
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          相关资源
          最近更新 更多