我在屏蔽下面描述的資料時遇到了問題-
| 輸入 | 輸出 | |
|---|---|---|
| 1. | CC# S2345-567 匹配 2345 這是字串 | ************** 匹配 2345 這是字串 |
| 2. | 我的自我 CC P457-238 這是資料 | 我的自己 *********** 這是資料 |
| 3. | 我的卡是 CC 457829 | 我的卡是********* |
| 4. | 這是 CC# 42357 這是我的記錄 | 這是********* 這是我的記錄。 |
我能夠通過使用下面的查詢來掩蓋第三和第四個條件——
SELECT CASE
WHEN start_pos1 > 0
THEN SUBSTR( col, 1, start_pos1 - 1)
|| RPAD('*', end_pos1 - start_pos1, '*')
|| SUBSTR(col, end_pos1)
ELSE col
END AS col_new
FROM (
SELECT col,
REGEXP_INSTR( col, 'CC([. # -]*\d ) ', 1, 1, 0, NULL) AS start_pos1,
REGEXP_INSTR( col, 'CC([. # -]*\d ) ', 1, 1, 1, NULL) AS end_pos1
FROM Table
);
任何人都可以幫助解決上述第一個和第二個條件嗎?
uj5u.com熱心網友回復:
您需要匹配數字前的字母字符:
SELECT col,
CASE
WHEN start_pos1 > 0
THEN SUBSTR( col, 1, start_pos1 - 1)
|| RPAD('*', end_pos1 - start_pos1, '*')
|| SUBSTR(col, end_pos1)
ELSE col
END AS col_new
FROM (
SELECT col,
REGEXP_INSTR( col, 'CC#?\s [A-Z]?\d ([. -]*\d )*', 1, 1, 0, NULL) AS start_pos1,
REGEXP_INSTR( col, 'CC#?\s [A-Z]?\d ([. -]*\d )*', 1, 1, 1, NULL) AS end_pos1
FROM table_name
);
其中,對于您的示例資料:
CREATE TABLE table_name (col) AS
SELECT 'CC# S2345-567 Match 2345 This is String' FROM DUAL UNION ALL
SELECT 'My Self CC P457-238 This is Data' FROM DUAL UNION ALL
SELECT 'My Card is CC 457829' FROM DUAL UNION ALL
SELECT 'This is the CC# 42357' FROM DUAL UNION ALL
SELECT 'The ABCC should not be masked' FROM DUAL;
輸出:
上校 COL_NEW CC# S2345-567 匹配 2345 這是字串 ************* 匹配 2345 這是字串 我的自我 CC P457-238 這是資料 我的自己 *********** 這是資料 我的卡是 CC 457829 我的卡是********* 這是 CC# 42357 這是******** ABCC 不應該被掩蓋 ABCC 不應該被掩蓋
db<>在這里擺弄
uj5u.com熱心網友回復:
嘗試使用REGEXP_REPLACE這里:
SELECT col,
REGEXP_REPLACE(col, 'CC#?[[:space:]] \S ', '********') AS col_masked
FROM yourTable;
uj5u.com熱心網友回復:
另一種選擇:
WITH cteData
AS (SELECT col, REGEXP_SUBSTR(col, 'CC#? [A-Z]?[-0-9] ') AS MATCH_DATA
FROM table_name)
SELECT col, MATCH_DATA, REPLACE(col, MATCH_DATA, RPAD('*', LENGTH(MATCH_DATA), '*'))
FROM cteData
db<>在這里擺弄
(非常感謝@MT0 提供示例資料:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389870.html
標籤:甲骨文
下一篇:如何洗掉列中兩行之間的空格
