Oracle/SQL

2012.01.02 SQL 1일차(3) 연습노트( RTRIM의 미묘한 삭제, SUBSTR연습 )

에몽이ㅋ 2012. 1. 9. 22:43
연습노트

====================================================================================================================================================================================================================================================== 
결과 고찰
학생테이블의 전화번호칼럼에서 지역번호와 이름을 출력하라.
문제에서

 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.