사용자 도구

사이트 도구


dbms:oracle:devel:regexp:regexp_substr

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
dbms:oracle:devel:regexp:regexp_substr [2013/03/03 01:11]
starlits [주소문자열 자르기]
dbms:oracle:devel:regexp:regexp_substr [2019/03/05 00:40] (현재)
starlits [구분자로 나누기]
줄 1: 줄 1:
-====== 오라클 정규표현식 - REGEXP_SUBSTR ======+====== REGEXP_SUBSTR ======
  
-===== REGEXP_SUBSTR =====+===== 정의 ===== 
 +  - 오라클 정규표현식의 일종.
  
-==== 숫자/문자 분리 ====+===== 이메일 아이디 분리 ===== 
 +  - 이메일형식에서 아이디와 메일도메인 부분을 분리하여 조회한다. <code> 
 +with t as ( 
 +  select 'starlits@adminschool.net' as email from dual 
 +
 +SELECT email 
 +  ,REGEXP_SUBSTR(email, '[^@]+', 1, 1) AS "ID" 
 +  ,REGEXP_SUBSTR(email, '[^@]+', 1, 2) AS "MailAddr" 
 +FROM t 
 +
 +</code> <code> 
 +EMAIL                    ID                       MailAddr                
 +------------------------ ------------------------ ------------------------ 
 +starlits@adminschool.net starlits                 adminschool.net     
 +</code> 
 +  - [[dbms:oracle:devel:regexp:regexp_like#이메일_형식_체크 | 이메일 형식 조회 ]] 
 +  - [[dbms:oracle:devel:regexp:constraint | 컬럼에 이메일 형식 제약조건 만들기 ]] 
 +===== 숫자/문자 분리 ===== 
 + 
 +==== 방법 1 ====
  
   - STUDYUNITCODE를 숫자와 문자를 분리하여 나타낸다. (맨 앞에 0은 삭제한다.) <code sql>   - STUDYUNITCODE를 숫자와 문자를 분리하여 나타낸다. (맨 앞에 0은 삭제한다.) <code sql>
 SELECT   SELECT  
     STUDYUNITCODE,     STUDYUNITCODE,
-    REGEXP_SUBSTR(REGEXP_REPLACE(STUDYUNITCODE,\'^\0\',\'\'),\'[[:digit:]]{1,2}\') TAPE, +    REGEXP_SUBSTR(REGEXP_REPLACE(STUDYUNITCODE,'^0',''),'[[:digit:]]{1,2}') TAPE, 
-    REGEXP_SUBSTR(STUDYUNITCODE,\'[[:alpha:]]{1}\') SIDE+    REGEXP_SUBSTR(STUDYUNITCODE,'[[:alpha:]]{1}') SIDE
 FROM TB_STUDYUNIT  FROM TB_STUDYUNIT 
 ORDER BY KWON,STUDYUNITCODE ORDER BY KWON,STUDYUNITCODE
-</code> +</code> <code>
-  - 결과값 <code>+
 STUDYUNITCODE TAPE SIDE STUDYUNITCODE TAPE SIDE
  
줄 24: 줄 43:
 </code> </code>
  
-==== 페이지정보 찾기 ====+==== 방법 2 ==== 
 +  - REGEXP_REPLACE 를 이용하여 숫자를 제외시킨다. <code> 
 +with t as ( 
 +  select '01AB' tape from dual 
 +  union all 
 +  select '01BA' tape from dual 
 +
 +select regexp_replace(tape, '[[:digit:]]',''
 +from t; 
 +</code> <code> 
 +TAPE    SIDE 
 +-------------- 
 +01AB    AB                                                                               
 +01BA    BA       
 +</code> 
 +  - REGEXP_REPLACE 를 이용하여 문자를 제외시킨다. <code> 
 +with t as ( 
 +  select '01AB' tape from dual 
 +  union all 
 +  select '01BA' tape from dual 
 +
 +select regexp_replace(tape, '[^[:digit:]]',''
 +from t; 
 +</code><code> 
 +TAPE    SIDE 
 +-------------- 
 +01AB    01                                                                               
 +01BA    01       
 +</code> 
 +===== 페이지정보 찾기 =====
  
   - 페이지정보에서 첫페이지를 찾아서 알려준다. <code sql>   - 페이지정보에서 첫페이지를 찾아서 알려준다. <code sql>
-SELECT SOURCE, REPLACE(REGEXP_SUBSTR(SOURCE,\'p[[:digit:]]{1,3}\'),\'p\',\'\') PAGE+SELECT SOURCE, REPLACE(REGEXP_SUBSTR(SOURCE,'p[[:digit:]]{1,3}'),'p','') PAGE
 FROM QUESTION WHERE ROWNUM < 10; FROM QUESTION WHERE ROWNUM < 10;
 </code> </code>
줄 44: 줄 92:
 </code> </code>
  
-==== 주소문자열 자르기 ====+===== 주소문자열 자르기 =====
   - 전체 주소에서 시도,등의 문자열을 나누어 보여준다. <code sql>   - 전체 주소에서 시도,등의 문자열을 나누어 보여준다. <code sql>
 SELECT  SELECT 
      ADDRESS      ADDRESS
-    ,REGEXP_SUBSTR(ADDRESS,\'[^ ]+\') AS SIDO +    ,REGEXP_SUBSTR(ADDRESS,'[^ ]+') AS SIDO 
-    ,REPLACE(REGEXP_SUBSTR(ADDRESS,\' +[^ ]+\'),\\',\'\') as GUGUN +    ,REPLACE(REGEXP_SUBSTR(ADDRESS,' +[^ ]+'),' ','') as GUGUN 
-    ,REPLACE(ADDRESS,REGEXP_SUBSTR(ADDRESS,\'[^ ]+\')||REGEXP_SUBSTR(ADDRESS,\' +[^ ]+\')||\\',\'\') AS etc +    ,REPLACE(ADDRESS,REGEXP_SUBSTR(ADDRESS,'[^ ]+')||REGEXP_SUBSTR(ADDRESS,' +[^ ]+')||' ','') AS etc 
-    ,REGEXP_SUBSTR(ADDRESS,\'[^ ]+(.)$\'   +    ,REGEXP_SUBSTR(ADDRESS,'[^ ]+(.)$'   
 FROM DV_ADDRESS_TEMP ; FROM DV_ADDRESS_TEMP ;
 </code> </code>
줄 61: 줄 109:
 | 충남 태안군 태안읍 동문리 529-2 | 충남 | 태안군 | 태안읍 동문리 529-2 | 529-2 |  | 충남 태안군 태안읍 동문리 529-2 | 충남 | 태안군 | 태안읍 동문리 529-2 | 529-2 | 
 | 충남 태안군 태안읍 동문리 879-3 | 충남 | 태안군 | 태안읍 동문리 879-3 | 879-3 |  | 충남 태안군 태안읍 동문리 879-3 | 충남 | 태안군 | 태안읍 동문리 879-3 | 879-3 | 
 +
 +===== 구분자로 나누기 =====
 +  - 숫자를 기준으로 나눈다 <code sql>
 +with tt as (
 +  select '147[1]36126[2]37980[3]2047627[4]1207745[5]' as str from dual
 +)
 +select 
 +   REGEXP_SUBSTR(str,'[0-9]+',1,1) as a1
 +  ,REGEXP_SUBSTR(str,'[0-9]+',1,2) as a2
 +  ,REGEXP_SUBSTR(str,'[0-9]+',1,3) as a3  
 +from tt;
 +</code>
 +  - 결과값 <code>
 +A1  A A3  
 +--- - -----
 +147 1 36126
 +</code>
 +
 +  - 공백으로 나눈다 <code sql>
 +with v_time as (
 +    select '2016. 1. 29. 오후 11:00:53' as time from dual
 +)
 +select 
 +    time
 +    ,REGEXP_SUBSTR(time,'[^ ]+',1,1,'i'
 +    || REGEXP_SUBSTR(time,'[^ ]+',1,2,'i'
 +    || REGEXP_SUBSTR(time,'[^ ]+',1,3,'i') AS ymd
 +    ,TO_DATE(REGEXP_SUBSTR(time,'[^ ]+',1,1,'i'
 +    || REGEXP_SUBSTR(time,'[^ ]+',1,2,'i'
 +    || REGEXP_SUBSTR(time,'[^ ]+',1,3,'i'),'YYYY.fmMM.DD.') AS convert_time   
 +from v_time;
 +</code>
 +  - 결과값 <code>
 +TIME                       YMD              CONVERT_TIME       
 +------------------------   ---------------  -------------------
 +2016. 1. 29. 오후 11:00:53  2016.1.29.       2016-01-29 00:00:00
 +</code>
 +
 +===== 전화번호 나누기 =====
 +  - 전화번호 구분자(-) 로 전화번호를 나눈다. <code sql>
 +with cust as (
 +  select '010-1234-5678' as phone from dual
 +)
 +select 
 +REGEXP_SUBSTR(phone, '[^-]+', 1, 1) AS str1
 +     , REGEXP_SUBSTR(phone, '[^-]+', 1, 2) AS str2
 +     , REGEXP_SUBSTR(phone, '[^-]+', 1, 3) AS str3
 +     , REGEXP_SUBSTR(phone, '[^-]+$', 1, 1) AS last_str 
 +from cust;
 +</code>
 +  - 결과 <code>
 +STR STR2 STR3 LAST_STR
 +--- ---- ---- ----
 +010 1234 5678 5678
 +</code>
 +
 +==== 뒷자리 4자리만 가져오기 ====
 +  - 구분자없이 뒷자리 4자리만 가져오기 위해서는 regexp_substr 보다 substr 이 더 효과적이다. <code sql>
 +with cust as (
 +  select '010-1234-5678' as phone from dual
 +)
 +select substr(phone,-4,4) as str
 +from cust;  
 +</code>
 +
 +===== 첫단어 가져오기 =====
 +  - 숫자/문자로만 이루어진 첫단어 <code sql>
 +SELECT REGEXP_SUBSTR('first-team second-team third-team', '[[:alnum:]]*') FROM dual;
 +</code> <code>first</code>
 +  - 스페이스가 있기 전까지의 첫단어 <code sql>
 +SELECT REGEXP_SUBSTR('first-team second-team third-team', '[^ ]+') FROM dual;
 +</code><code>first-team</code>
dbms/oracle/devel/regexp/regexp_substr.1362240665.txt.gz · 마지막으로 수정됨: 2013/03/03 01:11 저자 starlits