연습노트
======================================================================================================================================================================================================================================================
결과 고찰
학생테이블의 전화번호칼럼에서 지역번호와 이름을 출력하라.
문제에서
select RTRIM(tel, SUBSTR(tel,-9,9)) from student;
의 경우
RTRIM(TEL,SUB
-------------
0
0
055
051
051
055
055
05
055
0
05
RTRIM(TEL,SUB
-------------
053
055
052
02
055
16 rows selected.
|
SQL> select tel from student;
의 경우
TEL ------------- 051)781-2158 055)426-1752 055)261-8947 051)824-9637 051)742-6384 055)419-6328 055)418-9627 051)724-9618 055)296-3784 02)312-9838 051)239-4861
TEL ------------- 053)487-2698 055)736-4981 052)175-3941 02)785-6984 055)248-3679
16 rows selected. |
이러한 결과가 나온다. 왜 이러한 결과가 나올까?
RTRIM의 경우 지정한 문자열의 마지막글자를 비교하는데, 그 마지막 글자와 조건의 글자중에 일치하는 글자가 있다면 마지막 글자는 삭제가 된다.
예를 들어, 첫번째 행을 보면, 예상되는 결과를 051로 예상했다. 하지만 결과는 0
분석해보면 SUBSTR로 인해 051이후의 글자가 모두 조건의 문자열이 되고, 남는 051은 비교대상문자열이 된다.
좀 더 정확히 말하자면, 1, 5, 0 문자가 차례대로 비교대상문자가 된다.(계속 읽어보세요)
051과 )781-2158을 비교하게 되면 ')781-2158'중에 1,5가 존재하므로 비교대상 문자열 중 1과 5가 차례대로 삭제되어 남는 문자는 0이 남게된다.
이런 식으로 나머지 결과도 생각하면 되겠다.
select RTRIM(TEL, SUBSTR(TEL,-8,8)의 경우는 비교대상 문자열이 xxx)나 xx)가 되고,
이 중 마지막 글자 ')' 는 조건의 글자(xxx-xxxx)중에 일치하는 글자가 없기때문에 삭제가 되지 않으므로
다시 말해서 ), x, x, x가 차례로 비교대상문자들이 되는데 ')'은 삭제가 되지 않으므로 나머지 숫자들(xxx, xx)는 삭제가 되지 않는다.
결과는 아래와 같이 된다.
결국 RTRIM은 단순히 우측 문자 삭제가 아닌 조건, 비교대상이 생각하는 것과 다를 수 있어서 쓸때 좀 생각해야한다.
RTRIM(TEL,SUB
-------------
051)
055)
055)
051)
051)
055)
055)
051)
055)
02)
051)
RTRIM(TEL,SUB
-------------
053)
055)
052)
02)
055)
16 rows selected.
======================================================================================================================================================================================================================================================
생년월일 다음에 '-'붙여서 출력하기(수정요함)
substr(idnum,-6,6) --> substr(idnum,-7,7)
1 select name, grade, concat(rpad(substr(idnum,1,6) ,7,'-'),substr(idnum,-6,6)) "주민등록번호"
2 from student
3* order by grade desc
NAME G 주민등록번호
---------- - --------------------------
전인하 4 790702-369824
오유석 4 770912-128379
이광훈 4 810913-276431
윤진욱 3 790402-358671
김영균 3 810321-063421
김진영 2 820606-186327
서재진 1 851129-186273
하나리 1 850109-378641
박동진 1 851124-639826
박미경 1 840516-123648
이동훈 1 831210-128467
16 rows selected.
'Oracle > SQL' 카테고리의 다른 글
2012.01.03 SQL 2일차(2) 일반함수(nvl,nvl2,decode,case) (0) | 2012.01.09 |
---|---|
2012.01.03 SQL 2일차(1) 문자함수(LPAD,RPAD,REPLACE), 숫자함수, 날짜함수, 변환함수 (0) | 2012.01.09 |
SQL Plus 명령어 (0) | 2012.01.09 |
2012.01.02 SQL 1일차(2) (sql함수,문자함수,대소문자변환함수,문자열길이반환함수,문자조작함수) (0) | 2012.01.09 |
2012.01.02 SQL 1일차(1) (literal,연결연산자,where,between,in,like,null,집합연산자,정렬) (0) | 2012.01.09 |