반응형

개행문자 (\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
;


반응형
반응형

Oracle Replace 함수 생성(결과값 변환 출력)


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
CREATE OR REPLACE FUNCTION FN_REPLACE_CUST(
    IN_VALUES     IN      VARCHAR2,
    IN_TYPE         IN INT,
    IN_DELIMETER IN    VARCHAR2
)
RETURN VARCHAR2
    
/**************************************************************************
  # FN : FN_REPLACE_CUST
  # 옵션
  IN_VALUES     : 분리할 문자열 입력
  IN_TYPE        : 출력값 구분자(코드, 코드명)
  IN_DELIMITER : 분리할 구분자
**************************************************************************/
IS
    RETURN_VAL    VARCHAR2(2000); -- 결과 리턴 변수
    TMP_RET_VALUE VARCHAR2(2000);  -- 결과 임시 저장 변수
    
    SET_CODE  VARCHAR2(2000);        -- SELECT 결과 코드 저장 
    SET_CODE_NAME VARCHAR2(2000); -- SELECT 결과 코드명 저장
     
BEGIN
    
   -- IN_VALUES의 값이 없으면 빈 값을 리턴하고 종료
    IF LENGTH(LTRIM(RTRIM(IN_VALUES))) = 0 THEN
        RETURN '';
    END IF;
    
   FOR ForResult IN
    (
     WITH T AS
      (
        SELECT IN_VALUES AS SET_VALUES FROM DUAL -- 입력받은 문자열 임시 테이블 처리
       )
       /* 문자열을 분리하여 세로로 추출 */
       SELECT TRIM(REGEXP_SUBSTR(SET_VALUES, '[^'||IN_DELIMETER||']+', 1, LEVEL)) AS SET_VALUES
         FROM T
         CONNECT BY INSTR(SET_VALUES, ''||IN_DELIMETER||'', 1, LEVEL - 1) > 0
    )
    LOOP
            /* COMMON_CODE 의 코드 값과 비교후 결과값 대입 */
            SELECT CODE_M, CODE_M_NAME
                INTO SET_CODE, SET_CODE_NAME
                FROM COMMON_CODE
                WHERE CODE_L = '005'
                AND CODE_M = ForResult.SET_VALUES;
                  
            /* # IN_TYPE 구분값에 따라 코드번호, 코드명 추출 */
            IF IN_TYPE = 1 THEN
                TMP_RET_VALUE := SET_CODE;
            ELSIF IN_TYPE = 2 THEN
                TMP_RET_VALUE := SET_CODE_NAME;
            END IF;
                  
            /* # 결과값 저장 : 결과값 가로 배치 */
            IF RETURN_VAL IS NULL THEN
                    RETURN_VAL := TMP_RET_VALUE;
               ELSE
                    RETURN_VAL := RETURN_VAL||','||TMP_RET_VALUE;
            END IF;
    END LOOP;
    
    RETURN RETURN_VAL; -- 결과 리턴
    
    EXCEPTION
         WHEN OTHERS THEN
--              RETURN SQLERRM;
            RETURN IN_VALUES; -- 에러 또는 조인 결과값 없을시 기본 입력받은 값 리턴
    
END FN_REPLACE_CUST;
/



> 생성후 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- # IN_TYPE : 1
SELECT ORG_TYPE, FN_REPLACE_CUST(ORG_TYPE, 1, '|') AS REPLACE_VALUES
    FROM USER_INFO
;       
 
ORG_TYPE         REPLACE_VALUES
--------------------------------------------
101|102|103|104    101,102,103,104
 
 
-- # IN_TYPE : 2
SELECT ORG_TYPE, FN_REPLACE_CUST(ORG_TYPE, 2, '|') AS REPLACE_VALUES
    FROM USER_INFO
;    
 
ORG_TYPE         REPLACE_VALUES
--------------------------------------------
101|102|103|104    가수,작곡가,작사가,기타

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

반응형

+ Recent posts