반응형
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
반응형
'programing' 카테고리의 다른 글
"상태 아님" 조건을 기준으로 데이터 프레임에서 행 삭제 (0) | 2023.06.29 |
---|---|
오라클 시스템이 유니코드 또는 멀티바이트 문자를 지원하도록 설정되었는지 확인하는 방법은 무엇입니까? (0) | 2023.06.29 |
Git 분기의 커밋 수 카운트 (0) | 2023.06.29 |
Firebase에서 push()를 사용할 때 고유 ID를 가져오는 방법 (0) | 2023.06.29 |
최신 Git commit에서 간단히 패치를 생성하려면 어떻게 해야 합니까? (0) | 2023.06.29 |