반응형

Oracle 10g에서는 REGEXP_로 시작하는 함수를 지원합니다. 레귤러 익스프레션 지원이죠. 아래는 그 함수들의 사용방법을 공유합니다.

1. REGEXP_INSTR 함수
- 문법 : REGEXP_INSTR(소스 문자열, Pattern [, 검색 시작 위치 [, 발생 횟수 [, 반환 옵션 [, Match를 시도할 때의 옵션]]]])
- 예제

1
2
3
4
5
6
SELECT REGEXP_INSTR('Regular Expression', 'a') REG_INS
FROM dual;
 
   REG_INS
----------
         6



2. REGEXP_LIKE
- 문법 : REGEXP_LIKE(소스 문자열, Pattern [, Match를 시도할 때의 옵션])
- [[:digit:]] : 숫자인것
- [^[:digit:]] : 숫자가 아닌것
- [[:alpha:]]
- 필듯가 숫자와 문자가 같이 있을 경우 잘 판단해야 함
- 예제

1
2
3
4
5
6
7
8
9
10
SELECT SSN                            
FROM   TEST                           
WHERE  SSN > ' '                      
AND    REGEXP_LIKE(SSN, '[^[:digit:]]');
 
SSN
-------------
******2229149
******2228659
******2223591



3. REGEXP_REPLACE
- REGEXP_REPLACE(소스 문자열, Pattern [, 바꿀 문자열 [, 위치 [, 발생횟수 [Match 파라미터]]]])
- 예제

1
2
3
4
5
6
7
8
9
SELECT REGEXP_REPLACE(SSN, '[0-9]', '*' , 7) REG_REP
FROM(                                               
          SELECT '7901061842210' SSN                
          FROM dual                                 
);   
 
REG_REP
-------------
790106*******



4. REGEXP_SUBSTR
- REGEXP_SUBSTR(소스 문자열, Pattern [, 위치 [, 발생 횟수 [, Match를 시도할 때의 옵션]]])
- 예제

1
2
3
4
5
6
7
8
9
SELECT REGEXP_SUBSTR(EMAIL, '[^@]+') REG_SUB
FROM(                                      
         SELECT 'pepsi@paran.com' EMAIL    
         FROM dual                         
); 
 
REG_S
-----
pepsi


위 내용 출처 : http://happybuk.tistory.com/50


# 문자 클래스
 [:digit:]    : 숫자
 [:punct:]  : 특수문자
 [:alpha:]  : 알파벳

기타, 정규표현식 단축 문자, 문자 클래스


# 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
-- # 문자 클래스이용 숫자, 특수문자 제거
*/
SELECT REGEXP_REPLACE(
                '!23$56^*[]<>()~`'' 숫자, .특수문자 테스트_Test '
                , '[[:digit:]|[:punct:]]'
                , '') AS RESULT
     FROM DUAL
;   
RESULT
--------------------------------------------------------------------------------
 숫자 특수문자 테스트Test
 
 
--------------------------------------------------------------------------------
/*
    -- TOPIC 컬럼에 한글이 1~10개 사이인 것을 조회
    -- 옵션
    $ = {}$ 과 사용시에 절대값인듯...?
*/
 
SELECT BULLETIN_SEQ
        , TOPIC
        , CREATE_ID
    FROM BULLETIN
    WHERE REGEXP_LIKE(TOPIC, '^[가-힝]{1,10}$')
    ORDER BY 1
;
 
--------------------------------------------------------------------------------
/*
    -- 한글 문자인 것만 조회
*/ 
SELECT BULLETIN_SEQ
        , TOPIC
        , CREATE_ID
    FROM BULLETIN
    WHERE REGEXP_LIKE(TOPIC, '^[가-힝]')
    ORDER BY 1
;
 
--------------------------------------------------------------------------------
/*
   -- # TOPIC 컬럼에 영어 대소문자가 3~10개 사이 또는 한글이 2~3개 사이인 것을 조회
*/ 
SELECT BULLETIN_SEQ
        , TOPIC
        , CREATE_ID
    FROM BULLETIN
    WHERE REGEXP_LIKE(TOPIC, '^[a-zA-Z]{3,10}|[가-힝]{2,3}$')
;   
 
--------------------------------------------------------------------------------
SELECT pw
  FROM t
 WHERE REGEXP_LIKE(pw, '[a-z]') -- 소문자 포함 여부
   AND REGEXP_LIKE(pw, '[A-Z]') -- 대문자 포함 여부
   AND REGEXP_LIKE(pw, '[0-9]') -- 숫자 포함 여부
   AND REGEXP_LIKE(pw, '[[:punct:]]') -- 특수문자 포함 여부
   AND LENGTH(pw) >= 8 -- 8자리 이상
;
 
--------------------------------------------------------------------------------
/*
   -- # 컬럼 check 제약 조건
*/
-- 10자 이하의 한글만 입력 받고자 할때.
ALTER TABLE BULLETIN
       ADD CONSTRAINT BULLETIN_USER_NAME_KO_CHK
       CHECK (REGEXP_LIKE(USER_NAME_KO, '^[가-힝]{1,10}$'))
;

출처 ; http://develop.sunshiny.co.kr/840

반응형
반응형

개행문자 (\r\n)
chr(10) : Line Feed   <-- 줄바꾸기
chr(13) : CR   <-- 행의 처음으로 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
-- 개행후 첫번째를 ; 으로 교체
-- REPLACE(CAREER, chr(10), chr(13)||chr(10)||';')
 
WITH T AS(
    SELECT '개인전
2011
2007
2005
2003
2003' AS CAREER
    FROM DUAL
)
SELECT REPLACE(CAREER, chr(10), chr(13)||chr(10)||';') AS CAREER
    FROM T
;
CAREER
--------------------------------------------------------------------------------
개인전
;2011
;2007
;2005
;2003
;2003
 
 
-- log 함수 : 상용로그 값을 구함.
SELECT LOG(100, 1000)
    FROM DUAL
;
LOG(100,1000)
-------------
          1.5
 
 
-- sign 함수 : 결과물이 음수이면(-)로 양수면(+)로 표시
SELECT SIGN(2-5), SIGN(2-2), SIGN(5-2)
    FROM DUAL
;   
 SIGN(2-5)  SIGN(2-2)  SIGN(5-2)
---------- ---------- ----------
        -1          0          1
 
 
SELECT COS(90), TAN(90), ATAN(180)
    FROM DUAL
;    
   COS(90)    TAN(90)  ATAN(180)
---------- ---------- ----------
-.44807362 -1.9952004 1.56524083
 
 
-- chr 함수 : 해당 숫자를 아스키값으로 인식하여 그 값에 대한 문자를 출력
SELECT ASCII('A'), CHR(65)
    FROM DUAL
;   
ASCII('A') CH
---------- --
        65 A


반응형
반응형

Oracle 중복 값 체크및 제거


예) 하나의 게시물에 첨부파일 여러개가 등록되었을 경우, 특정 순번째 하나의 파일 정보만 추출


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
  -- #  ROW_NUMBER() OVER 를 이용한, 다중값에서 특정 값만 추출
*/
SELECT BOARD_SEQ
        , FILE_NAME
        , COUNT(BOARD_SEQ)
        , ORDER_NO
   FROM(
SELECT BOARD_SEQ
            , FILE_NAME
            , ROW_NUMBER() OVER (PARTITION BY BOARD_SEQ ORDER BY FILE_SEQ) ORDER_NO
    FROM BOARD_FILE BF
    )
    WHERE ORDER_NO = 1
    GROUP BY BOARD_SEQ, FILE_NAME, ORDER_NO
;  
 
/*
  -- #  ROWID 를 이용한, 다중값에서 특정 값만 추출
*/
SELECT BOARD_SEQ
            , FILE_NAME
            , COUNT(BOARD_SEQ)
    FROM BOARD_FILE BF
    WHERE ROWID IN(SELECT MAX(ROWID) FROM BOARD_FILE WHERE BOARD_SEQ = BF.BOARD_SEQ)
    GROUP BY BOARD_SEQ
;


반응형

+ Recent posts