如何在mysql上使用sql来转换某个列的值?

z5btuh9x  于 2021-07-24  发布在  Java
关注(0)|答案(5)|浏览(256)

我的数据库中有一个名为employee的表,结构如下:

Id   email                      phone        name
1    user@gmail.com           +7845690001    Jonney
2    Nortex.zone@gmail.com    +7845690781    North

例如,我有一些要屏蔽的数据 +7845690001+7845690*** . 完整版本如下。

Id   email                      phone        name
1    u**r@gmail.com           +7845690***  J****y
2    N*********e@gmail.com    +7845690***  N***h

我设法做到了这一点的姓名和电话:

Select CONCAT(MID(phone, 1, LENGTH(phone) - 3), '***') as new_phone,
CONCAT(LEFT(name,1),REPEAT("*",LENGTH(name)-2),RIGHT(name,1)) as new_name from employee.

我怎样才能通过电子邮件做到这一点?

pbpqsu0x

pbpqsu0x1#

终于找到了答案:

Select CONCAT(MID(phone, 1, LENGTH(phone) - 3), '***') as new_phone,
CONCAT(LEFT(name,1),REPEAT("*",LENGTH(name)-2),RIGHT(name,1)) as new_name,CONCAT(CONCAT(left(email,1),REPEAT("*",LENGTH(SUBSTRING_INDEX(email, "@", 1))-2),RIGHT(SUBSTRING_INDEX(email, "@", 1),1)),'@',SUBSTRING_INDEX(email,'@',-1)) as new_email from employee

谢谢大家。:)

flvlnr44

flvlnr442#

您可以使用mysql的字符串函数: LEFT() , RIGHT() , LENGTH() , REPEAT() ,和 SUBSTRING_INDEX() .
我只为你做这件事 email :

WITH
input(Id,email,phone,name) AS (
          SELECT 1 , 'user@gmail.com'        ,'+7845690001','Jonney'
UNION ALL SELECT 2 , 'Nortex.zone@gmail.com' ,'+7845690781','North'
)
SELECT
  id
, -- the leftmost single character or "email"
    LEFT(email,1)
 -- repeat "*" for the length of the part of "email" before "@" minus 2
 || REPEAT('*',LENGTH(SUBSTRING_INDEX(email,'@',1))-2)
 -- the rightmost single character of the part of "email" before "@"
 || RIGHT(SUBSTRING_INDEX(email,'@',1),1)
 -- hard-wire "@"
 ||'@'
 -- the part of "email" from the end of the string back to "@"
 ||SUBSTRING_INDEX(email,'@',-1)
 AS email
FROM input
-- out  id |         email         
-- out ----+-----------------------
-- out   1 | u**r@gmail.com
-- out   2 | N*********e@gmail.com
-- out (2 rows)
q43xntqr

q43xntqr3#

您可以在mysql中使用concat和substring函数。电子邮件和姓名具有相同的功能,名称使用相同的东西,并根据您的要求更改数字。

SELECT CONCAT(LEFT(`name`, 1),"***",RIGHT(`name`, 1)) as cname, CONCAT(LEFT(`email `, 1),"***",SUBSTRING(`email `, LOCATE("@", `email `)-1, LENGTH(`email `)-LOCATE("@", `email `)-1)) as cemail , CONCAT(LEFT(`phone`, 8),"***") as cphone FROM `test4`

编辑

w3nuxt5m

w3nuxt5m4#


要用确切的字符数填充,可以使用lpad函数。对于name,您可以执行以下操作:

SELECT CONCAT(LEFT(`name `,1),LPAD(RIGHT(`name `,1),LENGTH(`name `)-1,'*')) FROM `test4`

对电子邮件使用基于上层查询的查找和更改索引。

3mpgtkmj

3mpgtkmj5#

regexp\u替换也可以做到这一点。以下是如何处理电子邮件:

SELECT REGEXP_REPLACE(email, '(?!^).(?=[^@]+@)', '*') AS masked_email
FROM Employee;

说明:
(?!^) 我们确保匹配的字符不在字符串的开头,这样我们就跳过了第一个字符。
. 匹配要替换的字符
(?=[^@]+@)我们将在一个序列处停止,该序列是任何不是@的字符,然后后跟@。
两个字符之间匹配的每个字符都将被函数替换为*(第三个参数)。
对于电话号码,我将展示一个更简单的解决方案:

SELECT REGEXP_REPLACE(phone, '[0-9]{3}$', '***') AS masked_phone
FROM Employee;

[0-9]{3}正好匹配三位数字
$表示它们必须在字符串的末尾。
然后我们用三星代替它们。请注意,此解决方案假设您总是以电话号码总是以三位数结尾的方式存储电话号码。例如,如果我输入一个像“555-55-55-55”这样的电话,什么都不会被屏蔽。如果您不总是以相同的格式插入规范化的电话,那么您必须考虑更复杂的事情(例如fetch digit-fetch zero or more non digits-fetch digit-fetch zero or more non digits-fetch digit-fetch digit-end of string,然后用三个*替换匹配的内容)。这样地:

SELECT REGEXP_REPLACE(phone, '[0-9][^0-9]*[0-9][^0-9]*[0-9][^0-9]*$', '***') AS masked_phone
FROM Employee;

这里[0-9]表示一个数字,[^0-9]*表示零个或多个非数字。当然,同样的事情也可以简化,把数字和零个或更多的非数字放在一组中,然后重复三次:

SELECT REGEXP_REPLACE(phone, '([0-9][^0-9]*){3}$', '***') AS masked_phone
FROM Employee;

对于名称,我们可以执行以下操作:

SELECT REGEXP_REPLACE(name, '(?!^).(?=.+$)', '*') AS masked_name
FROM Employee;

所以我们再次跳过第一个字符,然后匹配并替换每个字符,直到字符串的最后一个字符。
重要提示:在上述示例中,我们保留字符串的长度。如果您想要更高的匿名性,可以按组获取数据,然后用单个*替换所需的组。例如电子邮件:

SELECT REGEXP_REPLACE(email, '^(.)(.)+([^@]@.+)$', '\\1*\\3') AS masked_email
FROM Employee;

这将取代john@gmail.dom 至jn@gmail.dom 以及margareth@gmail.dom 到mh@gmail.dom. 所以它也掩盖了长度。说明:
^是字符串的开头
是我们的第一组。它是一个字符
(.)+是第二组。它是一个或多个字符。
([^@]@.+)是我们的第三组。它是一个字符,不是@,后跟@,然后后跟一个或多个字符(任意)。
我们将其替换为\1(第一组),后跟单个*,后跟\3(第三组)。

相关问题