2017-12-01 9 views
0

문자열이 ON P6B 0B8입니다. 필요한 출력은 P6B OB8입니다.regexp_substr Oracle SQL 문장에서 마지막 두 단어 가져 오기

regexp_substr('ON P6B 0B8','[^ ]+$',1)을 사용하면 문장의 끝에서 마지막 단어를 얻을 수 있습니다. 그러나 어떻게하면 공간 뒤에서 두 번째 단어 인 마지막 단어를 얻을 수 있습니까?

regexp_substr은 뒤에서 볼 때 첫 번째 공간에서 멈추지 말고 두 번째 공간에 도달 할 때까지 계속 움직일 것이라고 어떻게 말합니까?

Oracle regexp에서 제공하는 메타 문자를 이해하는 데 어려움을 겪었습니다.

답변

0

다음은 문자열에서 마지막 2 세트의 문자를 가져올 정규식입니다. 캐나다 우편 번호를 받고있는 것으로 보이므로 좀 더 조심해야합니다.

WITH 절은 데이터가있는 테이블을 설정합니다. 첫 번째 행은 유효한 우편 번호 형식이지만 두 번째 행은 잘못되었습니다 (행 2 자). 테스트 케이스에 항상 예기치 않은 데이터를 사용하면 놀라움을 원하지 않으며 데이터에 항상 놀라움이 포함됩니다.

첫 번째 정규식은 문자열 끝에 공백으로 구분 된 2 세트의 3 문자를 찾습니다. 언뜻보기에는 이것이 괜찮은 것처럼 보일 수 있지만 데이터가 잘못되면 반환 될 것입니다. 그것을 조이려면 두 번째 정규식을 사용하십시오. 두 번째 정규식은 특히 캐나다 우편 번호 형식 인 uppercase_letter-digit-uppercase_letter-space-digit-uppercase_letter-digit를 확인하고 찾을 수없는 경우 NULL을 반환합니다. 어쩌면 이것을 NVL() 호출로 잡아 내고 대신 메시지를 반환하기를 원할 것입니다.

with tbl(str) as (
    select 'Windsor ON P6B 0B8' from dual union all 
    select 'Windsor_bad_postcode ON A3C 9BB' from dual 
) 
select --regexp_substr(str, '.* (.{3} .{3})$', 1, 1, NULL, 1) postcode_w_bad 
     regexp_substr(str, '.* ([A-Z]\d[A-Z] \d[A-Z]\d)$', 1, 1, NULL, 1) postcode 
from tbl; 
+0

고맙습니다 ... 정말 잘됐다. –