DataBase/Oracle DB

(Oracle) DUAL을 사용한 Multi row, Column Table

ABCD 2024. 2. 4.

안녕하세요. 개발자 ABCD입니다.
이번 시간에는 가상테이블을 사용시 다중 행을 만들 수 있는 방법을 소개해 보려고 합니다.
우선, 해당 방식을 사용하기 위해 알아야 할 것들을 설명을 한 후에 진행하도록 하겠습니다.

DUAL

DUAL은 CREATE를 사용하지 않고 가상으로 테이블을 생성하여 데이터를 보여 주고 싶을 때 사용합니다.
다음 예시를 sql에 작성하면 다음과 같이 결과가 나오게 됩니다.

SELECT '홍길동' AS 이름 FROM DAUL;

image

DECODE

DECODE는 조건문이라고 생각하시면 됩니다.
한가지 예를 들어 볼게요.

SELECT DECODE(NAME, '홍길동', 10, '강감찬', 20) FROM DUAL;

위와 같은 쿼리가 있다고 생각해 봅시다.
위에서의 코드는 만약 NAME이 '홍길동'이라면 10을 반환하고 '강감찬'이라면 20을 반환하는 쿼리문이 됩니다.

우리는 JavaJavaScript에서 if - else if 문을 본적이 있을 겁니다. 위와 같은 경우가 같은 문법이라고 생각하시면 이해하시기 편할 겁니다.

그럼 우리는 여기서 한가지 궁금한점이 발생합니다. if - else if 문이 있다면 if - else 문은??
물론!! 있습니다.

SELECT DECODE(NAME, '홍길동', 10, 50) FROM DUAL;

위의 쿼리는 NAME이 '홍길동'이면 10을 반환하고 그 외에는 50을 반환하라는 쿼리문이 됩니다.
자 그러면 우리는 이것을 응용하여 if- else if - else 문을 작성할 수 있습니다.

맞습니다!! 바로 아래와 같이 작성하는 것이죠.

SELECT DECODE(NAME, '홍길동', 10, '강감찬', 20, 50) FROM DUAL;

Multi row, Column Table

자! 우리는 이제 궁극적으로 생성하고 싶은 테이블을 생성할 준비가 되어 있습니다.

복잡하게 생각하지 말고 하나하나씩 생각해보면 됩니다.

 

첫째
테이블을 생성하고 컬럼을 만들고 이러한 과정이 필요할까요??? 아닙니다. 우리는 가상테이블을 사용할 거에요.

 

둘째

DEOCE를 사용하여 데이터를 추출할 것입니다.
우리는 테이블에서 사용하는 행의 숫자를 알고 있습니다. 이것을 rownum이라고 하죠.
그럼 우리는 DECODE에 데이터값을 넣어주는 맨 앞부분에 행의 숫자를 기준으로 판별하면 됩니다.

SELECT
    DECODE(rownum, 1, '홍길동', 2, '강감찬', 3, '세종대왕') AS 이름
    , DECODE(rownum, 1, '의적', 2, '문관/장군', 3, '조선의 왕') AS 직업
FROM
    DUAL
CONNECT BY LEVEL <= 3;

 

쿼리문이 이해가 가셨나요??

참고로 CONNECT BY LEVEL은 조회하고 싶은 계층의 갯수라고 생각하시면 됩니다.
위의 쿼리에서는 3개 이하로 출력한다는 뜻이죠.

 

이제 결과를 봐볼까요??

 

image

 

CONNECT BY LEVEL이 이해가 되지 않으셨다면, 4를 한번 넣어서 다시 테스트 해보겠습니다.

 

SELECT
    DECODE(rownum, 1, '홍길동', 2, '강감찬', 3, '세종대왕') AS 이름
    , DECODE(rownum, 1, '의적', 2, '문관/장군', 3, '조선의 왕') AS 직업
FROM
    DUAL
CONNECT BY LEVEL <= 4;

image

728x90
반응형

댓글

💲 추천 글