我有一個包含整數和字串組合的表資料。像這樣
CREATE TABLE EMPLOYEE (
empId INTEGER,
name TEXT NOT NULL,
email TEXT NOT NULL,
phone TEXT NOT NULL
);
INSERT INTO EMPLOYEE VALUES (12345, 'Clark Duff', '[email protected]',9001234567);
INSERT INTO EMPLOYEE VALUES (22245, 'Dave Johnson', '[email protected]',9000123456);
INSERT INTO EMPLOYEE VALUES (55456, 'Ava evelene', '[email protected]',9000012345);
但是我在 MYSQL 中尋找一個通用函式來檢查條件是特殊字符還是整數或字串。以下語法將屏蔽資料:
如果它是一個整數,那么這個條件需要執行:
concat(SUBSTRING(phone,1,3) , '*****' , SUBSTRING(phone,7,4)) phone
如果是特殊字符(@),則需要執行此條件:
CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`Mail`, '@', -1)) as Mail
ELSE 字串然后是其他腳本
uj5u.com熱心網友回復:
似乎您正在尋找應用于 @char 的類似條件的 case 陳述句或強制轉換為 usingned for chekc 一個有效的整數
select case
when email like '%@%' then CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`Mail`, '@', -1))
when cast(phone AS UNSIGNED) != 0 THEN concat(SUBSTRING(phone,1,3) , '*****' , SUBSTRING(phone,7,4))
else 'not managed'
end
uj5u.com熱心網友回復:
一個 UDF 來屏蔽它們。
CREATE FUNCTION fnMaskUserInfo ( input TEXT ) RETURNS TEXT DETERMINISTIC BEGIN IF input LIKE '%_@_%._%' THEN RETURN CONCAT(RIGHT(SHA1(input),8),'@',SUBSTRING_INDEX(input,'@',-1)); END IF; IF input REGEXP '^[0-9]{7,10}$' THEN RETURN CONCAT(SUBSTRING(input,1,3),'*****',SUBSTRING(input,7,4)); END IF; RETURN input; END
SELECT empId , fnMaskUserInfo(Name) AS Name , fnMaskUserInfo(email) AS email , fnMaskUserInfo(phone) AS phone FROM EMPLOYEE
| 員工編號 | 名稱 | 電子郵件 | 電話 |
|---|---|---|---|
| 12345 | 克拉克·達夫 | [email protected] | 900****4567 |
| 22245 | 戴夫·約翰遜 | [email protected] | 900****3456 |
| 55456 | 艾娃伊芙琳 | [email protected] | 900****2345 |
關于db<>fiddle 的演示在這里
uj5u.com熱心網友回復:
這是一個示例存盤函式。你是這個意思嗎?
CREATE FUNCTION `someFunc`(
input VARCHAR(255)
)
RETURNS VARCHAR(255)
NOT DETERMINISTIC
BEGIN
IF input LIKE '%@%' THEN
RETURN CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(input, '@', -1));
ELSEIF input REGEXP '^[0-9 ]{7,10}$' THEN
RETURN CONCAT(SUBSTRING(input, 1, 3) , '*****' , SUBSTRING(input, 7, 4));
ELSE
RETURN input;
END IF;
END
您可能希望使用LEFT(MD5(input), 8)代替,LEFT(UUID(), 8)以便可以將函式宣告為確定性的。
CREATE FUNCTION `someFunc`(
input VARCHAR(255)
)
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
IF input LIKE '%@%' THEN
RETURN CONCAT(LEFT(MD5(input), 8), '@', SUBSTRING_INDEX(input, '@', -1));
ELSEIF input REGEXP '^[0-9 ]{7,10}$' THEN
RETURN CONCAT(SUBSTRING(input, 1, 3) , '*****' , SUBSTRING(input, 7, 4));
ELSE
RETURN input;
END IF;
END
WITH `EMPLOYEE` (`empId`, `name`, `email`, `phone`) AS (
SELECT 12345, 'Clark Duff', '[email protected]',9001234567 UNION
SELECT 22245, 'Dave Johnson', '[email protected]',9000123456 UNION
SELECT 55456, 'Ava evelene', '[email protected]',9000012345
)
SELECT
empId,
someFunc(`name`) AS `name`,
someFunc(`email`) AS `email`,
someFunc(`phone`) AS `phone`
FROM `EMPLOYEE`;
| # empId | 名稱 | 電子郵件 | 電話 |
|---|---|---|---|
| 12345 | 克拉克·達夫 | [email protected] | 900****4567 |
| 22245 | 戴夫·約翰遜 | [email protected] | 900****3456 |
| 55456 | 艾娃伊芙琳 | [email protected] | 900****2345 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387418.html
