簡體   English   中英

Oracle SQL 查詢查找電話號碼的特殊字符

[英]Oracle SQL query to find special characters for phone numbers

我正在嘗試編寫一個查詢來查找電話號碼的特殊字符。

預計電話號碼是: 2047653894

實際: 204765389(4 , 204-7653894 , -2047653894 , (204)7653894 , 20476+53894 , ....

注意:我只想查找帶有特殊字符的電話號碼。 我不想替換特殊字符。

另一種選擇是刪除所有非數字(在這里,我住的地方,電話號碼只是數字;我不是在談論電話號碼可能具有的各種格式):

SQL> with test (col) as
  2    (select '204765389(4'  from dual union all
  3     select '204-7653894'  from dual union all
  4     select '-2047653894'  from dual union all
  5     select '(204)7653894' from dual union all
  6     select '20476+53894'  from dual
  7    )
  8  select
  9    col,
 10    regexp_replace(col, '\D') result
 11  from test;

COL          RESULT
------------ ------------------------------------------------
204765389(4  2047653894
204-7653894  2047653894
-2047653894  2047653894
(204)7653894 2047653894
20476+53894  2047653894

SQL>

[編輯]

如果您只想查找不包含數字的電話號碼,請使用regexp_like

SQL> with test (col) as
  2    (select '204765389(4'  from dual union all
  3     select '204-7653894'  from dual union all
  4     select '-2047653894'  from dual union all
  5     select '(204)7653894' from dual union all
  6     select '20476+53894'  from dual union all
  7     select '2047653897'   from dual
  8    )
  9  select col
 10  from test
 11  where regexp_like(col, '\D');

COL
------------
204765389(4
204-7653894
-2047653894
(204)7653894
20476+53894

SQL>

您可以將[[:punct:]] posix 與REGEXP_REPLACE()一起使用,例如

SELECT REGEXP_REPLACE(col,'[[:punct:]]') AS col
  FROM t

假設每個逗號分隔值代表表中的一個列值

演示

雖然您可以使用正則表達式,但它們很慢,使用簡單的字符串函數並使用TRANSLATE查找所有非數字字符然后替換它們可能會更快:

SELECT TRANSLATE(
         phone_number,
         '0' || TRANSLATE(phone_number, 'x0123456789', 'x')
         '0'
       ) AS simplified_phone_number
FROM   table_name;

其中,對於您的示例數據:

CREATE TABLE table_name (phone_number) AS
  SELECT '204765389(4' FROM DUAL UNION ALL
  SELECT '204-7653894' FROM DUAL UNION ALL
  SELECT '-2047653894' FROM DUAL UNION ALL
  SELECT '(204)7653894' FROM DUAL UNION ALL
  SELECT '20476+53894' FROM DUAL;

輸出:

SIMPLIFIED_PHONE_NUMBER
2047653894
2047653894
2047653894
2047653894
2047653894

小提琴


更新

如果你想列出非數字字符的電話號碼,那么你也可以使用TRANSLATE刪除數字並檢查是否有任何其他字符:

SELECT *
FROM   table_name
WHERE  TRANSLATE(phone_number, 'x0123456789', 'x') IS NOT NULL

您還可以使用REGEXP_LIKE檢查字符串是否不完全是數字:

SELECT *
FROM   table_name
WHERE  NOT REGEXP_LIKE(phone_number, '^\d+$')

或者有非數字:

SELECT *
FROM   table_name
WHERE  REGEXP_LIKE(phone_number, '\D')

但是,正則表達式可能會比簡單的字符串函數(如TRANSLATE )慢。

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM