개발자 끄적끄적
LPAD, RPAD, LEVEL 본문
<LPAD, RPAD, LEVEL>
- LPAD(값, 총 문자길이 , 채움문자) : 왼쪽 기준으로 지정된 문자, 공백을 채운다는 의미
ex) LPAD(123, 5, '0') -> 결과 : 00123
LPAD(123, 8, '0') -> 결과 : 00000123
- 총 문자길이 - Length(값) = 채움문자수
<RPAD>
- RPAD(값, 총 문자길이, 채움문자) : 오른쪽을 기준으로지정된 문자, 공백을 치운다
<LEVEL>
- LEVEL : 계층적 질의문에서 검색된 결과에 대해 계층별로 레벨 번호를 표시한다
루트 노드는 1이며 하위 레벨로 갈수록 1씩 증가한다
즉, 오라클에서 실행되는 모든 쿼리 내에서 사용 가능한 가상 '열'로써 트리 내에서 어떤 단계(LEVEL)에 있는지를 나타내 는 정수값이다
계층적인 쿼리가 아니라면 모든 값이 0, 즉 같은 단계를 가진다
계층적 쿼리에서는 LEVEL의 값을 통해 트리에서의 위치를 확인할 수 있다
- 계층적 질의문은 조인문이나 뷰에서는 사용할 수 없으며, CONNECT BY절에서는 서브쿼리 절을 포함할 수 없다
- 처음 시작 시 LEVEL 값이 1인경우 LPAD(1, 4)왼쪽에 공백 4자리 표시 후 1값을 출력한다
<예제 SQL - 30회 기출문제>
[SQL]
SELECT LEVEL,
LPAD('**', (LEVEL-1)*2, ' ') || 계층번호 AS 계층트리,
계층번호,
상위계층번호
FROM A
START WITH 상위계층번호 IS NULL
CONNECT BY 계층번호 = PRIOR 상위계층번호;
계층번호 상위계층번호
1 NULL
2 NULL
4 1
5 1
6 2
7 2
8 3
9 4
10 5
11 6
- LEVEL의 루트노드는 1이므로 (LEVEL-1)에 1을 넣으면 NULL이므로 첫번째 상위번호는 NULL로 출발한다
상위계층번호에 NULL값이 2개가 있는데, 우선 LEVEL값에 2를 대입하면
(LEVEL-1)*2 = 2가 나온다
즉, 두번 째 LEVEL에서 상위계층번호가 2가 되어야하므로
2 NULL
(6, 2) or (7, 2)가 나오는데 여기서 LEVEL값에 3을 대입하면 4가 나온다
하지만 세 번째 LEVEL에서 만족하는 계층번호
즉,
계층번호 상위계층번호
2 NULL - 첫 번째 LEVEL
6 or 7 2 - 두 번째 LEVEL
X 4 - 세 번째 LEVEL
이 되는데 CONNECT BY에서 계층번호 = PRIOR 상위계층번호를 만족하는 두번 째, 세 번째 값이 존재하지 않으므로
SQL이 실행되었을 때 결과 건수는 2개가 된다
'MySQL' 카테고리의 다른 글
MERGE INTO (0) | 2023.03.12 |
---|---|
Index의 종류와 특징 (0) | 2023.03.12 |
MySQL cmd 관련 명령어 (0) | 2023.03.08 |