【发布时间】:2022-01-20 06:55:41
【问题描述】:
我有多个表,例如 EMPLOYEE、EMPLOYEEMail 和更多表。 出于参考目的,我放了一些示例数据和 2 个表格
CREATE TABLE EMPLOYEE (
empId INTEGER PRIMARY KEY,
name TEXT NOT NULL,
dept TEXT NOT NULL,
phone bigint
);
INSERT INTO EMPLOYEE VALUES (0001, 'Clark', 'Sales',9001234567);
INSERT INTO EMPLOYEE VALUES (0002, 'Dave', 'Accounting',9000123456);
INSERT INTO EMPLOYEE VALUES (0003, 'Ava', 'Sales',9000012345);
CREATE TABLE EMPLOYEEMail (
empId INTEGER PRIMARY KEY,
MailID TEXT NOT NULL,
AlternateMail TEXT NOT NULL
);
INSERT INTO EMPLOYEEMail VALUES (0001, 'hello123@gmail.com','hi123@gmail.com');
INSERT INTO EMPLOYEEMail VALUES (0002, 'good123@gmail.com','bye123@gmail.com');
INSERT INTO EMPLOYEEMail VALUES (0003, 'super123@gmail.com','fast123@gmail.com');
查询:
SELECT CONCAT(SUBSTR(phone, 1, 6), REPEAT('*', CHAR_LENGTH(phone) - 6)) AS masked_phone
FROM `EMPLOYEE`;
select
CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`MailID`, '@', -1)) as phone,
CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`AlternateMail`, '@', -1)) as AlternateMail
from EMPLOYEEMail;
输出:
masked_phone
900123****
900012****
900001****
电话备用邮件
d8883d67@gmail.com d8883d92@gmail.com
d8883dd0@gmail.com d8883dde@gmail.com
d8883df3@gmail.com d8883dff@gmail.com
选择查询可以正常工作,但我需要屏蔽多个列,所有列都将以逗号分隔的值出现,像这样
(MailID ,AlternateMail,Phone,SSN,BankAccount,Addrress)
我正在寻找一个循环语句,我将在其中将这些值与 Information_schema.columns 表,该列与给定值匹配。
我正在尝试使用@column 和@tablename 将它们循环到动态选择语句中,并将屏蔽值加载到临时表中。 请就此向我提出建议。
【问题讨论】:
-
你的第一个查询可以写得更简单
SELECT INSERT(phone,7,10,"****") as masked_phone FROM EMPLOYEE;dbfiddle.uk/… -
@ErgestBasha 是的,同意我们可以用多种方式写作。但我正在寻找动态循环
-
你需要在动态SQL(准备好的语句)。
-
是的,正在寻找那个@Akina
-
通常需要按混淆值加入或分组,例如计算不同的电子邮件。我建议使用像 sha256 这样的确定性单向函数来代替非确定性混淆。 sha256 不允许恢复原始值,但允许 join 和 groupby 与非混淆值一样工作