Search

레이블이 Oracle인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Oracle인 게시물을 표시합니다. 모든 게시물 표시

2018년 12월 23일 일요일

[Database] [Oracle] sequence에 상관없이 string 값 비교하기 (TRANSLATE)

#1. 들어가기

특히, 코드값 등을 비교하는 쿼리를 작성할 때, 아래와 같이 특정 시퀀스에 관계없이 일치 여부를 판별해야 하는 경우가 종종 있다.
아래의 예는 TMP_TABLE에서 A_COL과 B_COL을 비교해 EQUAL 컬럼을 생성한 예제이다.



즉, 모든 유니크한 원소의 개수는 일치하면서 순서만 다른 경우를 판별하는 케이스인데, CONNECT BY LEVEL 등을 활용한 구문보다 TRANSLATE의 알고리즘을 활용하면 보다 간결하고 빠르게 동작하는 쿼리를 작성할 수 있다.


#2. 쿼리

아래와 같이 TRANSLATE 구문을 사용해 문제를 해결할 수 있다.

--string값의 순서에 상관없이 비교하기
SELECT      A_COL
           ,B_COL
           ,CASE WHEN TRANSLATE(A_COL, B_COL,' ') = TRANSLATE(B_COL, A_COL,' ')
                 THEN 'TRUE'
            ELSE      'FALSE'  END  AS  EQUAL
FROM        TMP_TABLE
;




[Database] [Oracle] 테이블 및 컬럼 검색하기

#1. 들어가기

데이터베이스 내에서 사용하는 스키마나 테이블이 많을 경우, 한 번에 어떤 컬럼 혹은 테이블이 어느 위치에 있는지 잘 모를 때가 많다. 혹은, 한글로된 코맨트 정보를 이용해 역추적 하는 경우도 많다.


#2. 쿼리

아래의 코드를 이용해 WHERE구문을 변경해가며 테이블이나 컬럼 위치를 찾으면 보다 유용하다.
- 테이블명 검색 : (영문or물리)A1.TABLE_NAME, (국문or논리)A1.COMMENTS
- 컬럼명 검색 : (영문or물리)A3._COLUMN_NAME, (국문or논리)A3.COMMENTS


--테이블 및 컬럼명 검색
SELECT      A1.OWNER                                                /*OWNER*/
           ,A1.TABLE_NAME                           AS  TAB_ID      /*테이블영문명*/
           ,A2.COMMENTS                             AS  TAB_NM      /*테이블한글명*/
           ,A3.COLUMN_ID                            AS  COL_SEQ     /*컬럼순서*/
           ,A1.COLUMN_NAME                          AS  COL_ID      /*컬럼영문명*/
           ,A1.COMMENTS                             AS  COL_NM      /*컬럼한글명*/
           ,A3.NULLABLE                             AS  NULL_YN     /*NULL여부*/  
           ,A3.DATA_TYPE||'('||A3.DATA_LENGTH||')'  AS DATA_TYPE    /*데이터타입*/
FROM        SYS.ALL_COL_COMMENTS  A1
INNER JOIN  SYS.ALL_TAB_COMMENTS  A2
        ON  A1.OWNER       = A2.OWNER
       AND  A1.TABLE_NAME  = A2.TABLE_NAME
INNER JOIN  SYS.ALL_TAB_COLS  A3
        ON  A1.OWNER       = A3.OWNER
       AND  A1.TABLE_NAME  = A3.TABLE_NAME
       AND  A1.COLUMN_NAME = A3.COLUMN_NAME
WHERE       A1.TABLE_NAME  = 'MY_TABLE_NAME'
ORDER BY    A1.OWNER
           ,A1.TABLE_NAME
           ,A3.COLUMN_ID
;

2018년 3월 11일 일요일

[Database] [Oracle] PIVOT과 UNPIVOT 함수 사용하여 데이터 형태 변환하기

#1. 들어가기
우리는 종종 GROUP BY를 통해 데이터를 집계하곤 한다.
보통 여러 컬럼에 구분된 값을 집계할 때 CASE문을 사용하는데, PIVOT 함수를 활용하는 방법을 알아보자.
또한, 잘 알려져있지는 않지만 UNPIVOT 함수를 이용해 그 역의 형태로 되돌리는 방법도 알아보자.


#2. PIVOT

 -> 

좌측(12rows) 형태에서 우측(4rows) 형태로 변환하려면, 아래와 같은 쿼리를 이용한다.
SELECT * FROM TMP
PIVOT (
    SUM(CNT) FOR MON IN (
        'M01' AS MON01
       ,'M02' AS MON02
       ,'M03' AS MON03
    )
)
ORDER BY ID
;


#3. UNPIVOT

  -> 

앞선 예제와는 반대로, 좌측(4rows) 형태에서 우측(12rows) 형태로 변환하려면, 아래와 같은 쿼리를 이용한다.
SELECT * FROM TMP
UNPIVOT (
    CNT FOR MON IN (
        MON01 AS 'M01'
       ,MON02 AS 'M02'
       ,MON03 AS 'M03'
    )
)
ORDER BY ID, MON
;


2016년 4월 16일 토요일

[Database] [Oracle] dual 테이블 사용 및 system 테이블 조회하기.

* ORACLE Database에서 Table정보 없이 기본 SELECT를 구현하려면 아래와 같이 해야한다.

SELECT 'OskarDevelopers' FROM dual;



* DB에 있는 Table, Column, View 정보 보기.

-- Table
SELECT * FROM all_tables;

-- Column
SELECT * FROM all_tab_columns;

-- View
SELECT * FROM all_views;