1.情景展示
返回服務器的身份證號需要進行加密:只保留前四位和后四位,中間使用*代替,如何實現?
2.解決方案
第一步:查看該表的身份證號的長度有幾種類型;

第二步:編寫sql
錯誤方式:

長度為15的會被替換成''。
正確方式:
--截取身份證號 SELECT DECODE(LENGTH(ID_CARD), 18, REPLACE(ID_CARD, SUBSTR(ID_CARD, 5, 10), '**********'), 15, REPLACE(ID_CARD, SUBSTR(ID_CARD, 5, 7), '*******')) 身份證號 FROM VIRTUAL_CARD_TEMP;

2020/07/03

身份證號保留首位和最后六位的前三位,如何實現?
SELECT DECODE(LENGTH(V.CARDNUM),
18,
SUBSTR(V.CARDNUM, 1, 1) || '***********' || SUBSTR(V.CARDNUM, 13, 3) || '***',
15,
SUBSTR(V.CARDNUM, 1, 1) || '********' || SUBSTR(V.CARDNUM, 10, 3) || '***') CARDNUM
FROM VIRTUAL_CARD V

JAVA代碼實現
String str = "*";
String id = "";
for (int i = 0; i < list.size(); i++) {
if (list.get(i).get("CARDNUM") != null) {
id = list.get(i).get("CARDNUM").toString();
StringBuilder sb = new StringBuilder(id);
for (int t = 1; t < id.length(); t++) {
if (t == id.length() - 6 || t == id.length() - 5 || t == id.length() - 4) {}
else {
sb.replace(t, t + 1, str);
}
}
list.get(i).put("CARDNUM", sb);
id = "";
}
}
