2014-05-21 56 views
0

如何使用Oracle SQL將某些數字替換爲'X'。如何使用'X'屏蔽移動電話號碼部分

舉例來說,如果我有一個隨機的手機號碼:

0400 100 200 or 0400100200

我想數屏蔽掉到:

0400 XXX XXX and 0400XXXXXX 

我一直在使用翻譯嘗試,但不能確定這是否是最好的方法。

謝謝。

回答

3

您可以使用REGEX_REPLACE,例如

SELECT REGEXP_REPLACE(SUSBTR(PhoneNumber, 5), '[0-9]', 'X') 

會用'X」 4字符後全部更換號碼,所以一個完整的例子是:

SELECT SUSBTR(PhoneNumber, 1, 4) 
      || REGEXP_REPLACE(SUSBTR(PhoneNumber, 5), '[0-9]', 'X') AS Masked 
FROM T; 

Example on SQL Fiddle

正如已指出了一個評論,您還可以使用如下TRANSLATE

SELECT TRANSLATE(SUBSTR(PhoneNumber, 5), '', 'XXXXXXXXXX') AS TRANSLATE; 

我對甲骨文很少有實際經驗,所以甚至不能猜測哪一個表現會更好,但評論員(亞歷克斯普爾)在Oracle中與我的53相比確實有2.3k的分數。因此,如果他建議TRANSLATE會跑得更快,我不會爭辯。我建議嘗試兩種方法,然後選擇最適合您的數據集的那個。

+1

或者[translate](http://sqlfiddle.com/#!4/3bbde/5),它稍微不那麼緊湊,但可能在大量數據上運行得更快(如果完全相關的話)。 –

+1

我不確定我是否曾經做過直接比較 - 這聽起來像是我讀過並假設爲真的東西 - [但其他人有](http://stackoverflow.com/q/16058279/266304) ,取決於數據的結果不一。除非您有大量數據和性能問題,否則可能不值得擔心;我有點不成熟* 8-)如果速度真的很重要,那麼OP應該測試兩者,否則使用哪個更適合。 –

+0

我去了翻譯。謝謝。 – tonyf

0

我寧願給一個答案:

String str = "12345678"; 
int len = str.length() - 3; 
StringBuilder replace = new StringBuilder(); 
for(int i = 0; i < len; ++i) 
    replace.append("X"); 
replace.append(len >= 0 ? str.substring(len) : ""); 
+0

這看起來不像SQL。你爲什麼給了Java解決方案? –

相關問題