2017-03-01 4 views
3

Ich habe eine große Tabelle mit Telefonnummern. Die Telefonnummern sind alle Zeichenfolgen und sollen "+9628789878" oder ähnlich sein. (ein "+" - Zeichen, gefolgt von 9 und 13 Ziffern.)Nicht REGEXP_LIKE in Oracle

Ein Benutzer Bug enthüllt eine Zeile mit der Zeichenfolge '+ 987 + 9873678298'. Offensichtlich sollte es nicht da sein und ich würde gerne herausfinden, wie viele andere Fälle es von diesen oder anderen solchen Fehlern gibt.

Ich habe diese Abfrage versucht, aber es funktioniert nicht. Mein Denken ist alles, was nicht wie diese Saite ist. (Oh, wird die Tabelle nicht durch phone_number indiziert.)

SELECT user_key, 
     first_name, 
     last_name, 
     phone_number 
FROM users u 
WHERE regexp_like(phone_number, '[^\+[0-9]*]') 
AND phone_number IS NOT NULL 
+1

Nicht verwandt, aber: 'phone_number IS NOT NULL' ist unnötig, weil NULL-Werte sowieso nicht' regexp_like' durchkommen. –

Antwort

7

Wenn Sie alle Zeilen finden müssen, wo phone_number nicht durch genau ein '+' von 9-13 Ziffern gefolgt gemacht wird, sollte dies die Arbeit machen:

select * 
from users 
where not regexp_like(phone_number, '^\+[0-9]{9,13}$') 

Was es tut:

  • ^ den Anfang der Zeichenfolge, um die Dinge zu vermeiden wie 'XX +123456789'
  • \+ die '+'
  • [0-9]{9,13} eine Sequenz von 9-13 Ziffern
  • $ das Ende des Strings, Strings zu vermeiden wie '+123456789 XX'

andere Art und Weise, ohne regexp, könnte folgende sein :

where not (
       /* strings of 10-14 chars */ 
       length(phone_number) between 10 and 14 
       /* ... whose first is a + */ 
      and substr(phone_number, 1, 1) = '+' 
       /* ...and that become a '+' after removing all the digits */ 
      and nvl(translate(phone_number, 'X', 'X'), '+') = '+' 
     ) 

Dies könnte schneller als der regexp Ansatz sein, auch wenn es auf mehr Bedingungen basiert, aber ich glaube, nur ein Test wird Ihnen sagen, welches das ist beste Leistung.

Verwandte Themen