programing

Oracle에서 REGEXP_LIKE가 아님

yellowcard 2023. 6. 29. 19:56
반응형

Oracle에서 REGEXP_LIKE가 아님

전화번호가 적힌 큰 테이블이 있습니다.전화 번호는 모두 문자열이며 '+9628789878' 또는 이와 유사해야 합니다. ("+" 기호 뒤에 9~13자리 사이의 숫자가 나옵니다.)

사용자 버그가 '+987+9873678298' 문자열이 있는 한 행을 발견했습니다.분명히 있어서는 안 되며 이러한 오류가 발생한 사례가 얼마나 더 있는지 알고 싶습니다.

이 쿼리를 사용해 보았지만 작동하지 않습니다.제 생각에는 이 문자열과 다른 것입니다. (아, 테이블은 phone_number로 색인화되어 있지 않습니다.)

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

모든 행을 찾아야 하는 경우phone_number정확히 a에 의해 만들어진 것은 아닙니다.'+'다음 9-13자리 숫자를 입력하면 다음과 같은 작업을 수행할 수 있습니다.

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

기능:

  • ^끈의 시작, 같은 것들을 피하기 위해.'XX +123456789'
  • \+'+'자
  • [0-9]{9,13}9-13자리의 연속
  • $문자열의 끝, 다음과 같은 문자열을 피합니다.'+123456789 XX'

regexp를 사용하지 않는 또 다른 방법은 다음과 같습니다.

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, 'X0123456789', 'X'), '+') = '+' 
          )

이는 더 많은 조건을 기반으로 하더라도 정규식 접근 방식보다 빠를 수 있지만, 테스트를 통해서만 어느 것이 가장 성능이 좋은지 알 수 있다고 생각합니다.

언급URL : https://stackoverflow.com/questions/42536101/not-regexp-like-in-oracle

반응형