C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/기본]3. 단일 행 함수 본문

Programming/Oracle 공부

[Oracle/기본]3. 단일 행 함수

19760323 2017. 5. 19. 17:42

 

● SQL 함수의 분류

 

- 단일 행 함수 : 오직 단일 행에서만 적용

                     행별로 하나의 결과를 리턴

                     데이터 값을 조작하는데 사용

                     중첩가능, SELECT, WHERE, ORDER BY 절에 사용 가능하다.

 

- 다중 행 함수 : 복수의 행을 조각하여 행의 그룹당 하나의 결과를 리턴

 

● 함수의 종류

 

☞  문자함수

 

- LOWER('SQL Course') → sql course

 

- UPPER('SQL Course') → SQL COURSE

 

- INITCAP('SQL Course') → Sql Course

  알파벳 문자 값을 각 단어의 첫 번째 문자는 대문자로, 나머지 문자는 소문자로 변환한다.

 

- CONCAT('A','B') → AB 또는 CONCAT(컬럼명,컬럼명)

  || 와 같은 기능이다. 단 2개밖에 연결하지 못한다.

 

- SUBSTR('String',1,3) → Str

  지정된 길이만큼 스트링을 추출한다.

 

- LENGTH('String') → 6

 

- INSTR('String', 'r') → 3

  명명된 문자의 위치를 숫자 값으로 리턴한다.

 

- LPAD('sal',10,'*') → *******sal                       

 

☞  숫자함수

 

- ROUND(45.923,2) → 45.92 

  두 번째 argument값이 양수이면, 해당 소수점 자리까지 반올림한다.

- ROUND(45.923,0) → 46

  두 번째 argument값이 0이거나 없으면1의자리 까지 반올림한다.

- ROUND(45.923,-1) → 50

  두 번째 argument값이 음수이면, 좌측 자리수에서 반올림 한다.

 

- TRUNC(45.923,2) → 45.92

- TRUNC(45.923,0) → 45

- TRUNC(45.923,-1) → 40

 

  TRUNC는 ROUND함수와 같지만 반올림이 아닌, 절삭(내림)한다.

 

- MOD(1600, 300) → 100

  나누기를 한 후의 나머지

 

☞  날짜함수

 

- MONTHS_BETWEEN(to_DATE('2008-11-25','YYYY-MM-DD'), to_date('2001-08-12','YYYY-MM-DD')) → 87.4193..

  MONTHS_BETWEEN(Date1, Date2) 는  월 단위로 날짜의 차 연산을 한다. (약 87개월)

 

Ex. 각각의 종업원에 대해서 종업원 이름을 디스플레이하고, 오늘 날짜와 종업원이 고용된 날짜 사이의 월 수를

     계산하십시오.

     열 레이블은 MONTHS_WORKED 입니다. 결과는 입사한 월 수로 정렬하십시오. 가장 근접하는 월 수로

     반올림 하십시오.

 

  SELECT ROUND (MONTHS_BETWEEN (SYSDATE, hiredate), 0)
    FROM scott.emp
ORDER BY MONTHS_BETWEEN (SYSDATE, hiredate);

 

- ADD_MONTHS(Date1, 5) → Date1날짜를 기준으로 5개월을 더한 값.

 

- NEXT_DAY(Date1, 'sunday') → Date1 날짜가 해당된 주의 '요일'의 날짜 출력.

                                      단, 예를들어 , 금요일에 금요일 조회하면 다음 주의 금요일 날짜 출력한다.

 

- LAST_DAY(Date1) → 해당 월의 마지막 날 출력

 

Ex. 종업원의 이름, 입사일  그리고 근무한지 6개워 이후의 첫 번째 금요일인 급여 재검토 일자를 디스플레이 하십시오. 열 레이플은

    REVIEW입니다. "Sunday, the seventh of September, 1981"과 유사한 형식으로 나타나게 날짜를 구성하십시오.

 

SELECT ename,
       hiredate,
       TO_CHAR (NEXT_DAY (ADD_MONTHS (hiredate, 6), 'MONDAY'),
                'fmDay, "the" Ddspth "of" Month, YYYY')
          AS review
  FROM scott.emp

 

-결과

 

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------------

- SYSDTE 예제 (출처 : http://www.gurubee.net/lecture/1026)
SELECT TO_CHAR(SYSDATE,'RRRR-MM-DD HH24:MI:SS') "지금시간"
  FROM DUAL ; 
 
SELECT TO_CHAR(SYSDATE-1,'RRRR-MM-DD HH24:MI:SS') "하루전지금시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-1/24,'RRRR-MM-DD HH24:MI:SS') "1시간전시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-1/24/60,'RRRR-MM-DD HH24:MI:SS') "1분전시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-1/24/60/10,'RRRR-MM-DD HH24:MI:SS') "6초전시간"
  FROM DUAL ;
 
SELECT TO_CHAR(SYSDATE-(5/24 + 30/24/60 + 10/24/60/60),'RRRR-MM-DD HH24:MI:SS') "5시간 30분 10초전"
  FROM DUAL ;

--------------------------------------------------------------------------------------------------------------------------------------------------------

- ROUND예제 (출처 : http://www.gurubee.net/lecture/1026)
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'YEAR'),
               'RRRR-MM-DD HH24:MI:SS'
  FROM DUAL;

☞ 년도 까지 반올림 (월 단위에서 반올림

 

SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'MONTH'),
               'RRRR-MM-DD HH24:MI:SS'
  FROM DUAL;

☞ 월 단위 까지 반올림 (일자에서 반올림

 
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'DD'),
               'RRRR-MM-DD HH24:MI:SS'
  FROM DUAL;

☞ 일자 까지 반올림 (시간에서 반올림

 
SELECT TO_CHAR(ROUND(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS')),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
 
-- 실행 결과 --
2012-01-01 00:00:00
2011-09-01 00:00:00
2011-09-12 00:00:00
2011-09-12 00:00:00

--------------------------------------------------------------------------------------------------------

- TRUNC예제 (출처 : http://www.gurubee.net/lecture/1026)

 

SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'YEAR'),
              'RRRR-MM-DD HH24:MI:SS'
  FROM DUAL;

☞ 년도까지 내림(월 단위 에서 내림)  

 
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'MONTH'),
               'RRRR-MM-DD HH24:MI:SS') 
  FROM DUAL;

☞ 월 단위 까지 내림 (일자에서 내림

 
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS'), 'DD'),
               'RRRR-MM-DD HH24:MI:SS') 
  FROM DUAL;

☞ 일 단위까지 내림(시간에서 내림

 
SELECT TO_CHAR(TRUNC(TO_DATE('2011-09-11 21:00:01',
                             'RRRR-MM-DD HH24:MI:SS')),
               'RRRR-MM-DD HH24:MI:SS')  
  FROM DUAL;
 
 
-- 실행 결과 --
2011-01-01 00:00:00
2011-09-01 00:00:00
2011-09-11 00:00:00
2011-09-11 00:00:00

--------------------------------------------------------------------------------------------------------

 

- ROUND(TO_DATE('1998/04/11','YYYY/MM/DD'), 'YEAR') : 1998/01/01

  날짜로 반올림, (월 단위에서 반올림)

- ROUND(TO_DATE('1998/04/11'),'MONTH') : 1998/04/01

  월 단위로 반올림, (짜 단위에서 반올림)

- ROUN(TO_DATE('1998.04.11'), 'DAY') : 1998/04/11

 

ROUND(Date, A) : A로 반올림 한다. (A아랫자리에서 반올림.) 

 

- TRUNC

 

SELECT SYSDATE
, TRUNC(SYSDATE)
, TRUNC(SYSDATE, 'YEAR')
, TRUNC(SYSDATE, 'MONTH')
, TRUNC(SYSDATE, 'DAY')
, TRUNC(123.4567,2)
, TRUNC(123.4567)
FROM DUAL


결과

2013/01/21 21:13:18
2013/01/21 00:00:00
2013/01/01 00:00:00
2013/01/01 00:00:00
2013/01/20 00:00:00
123.45
123

 

● 데이터의 변환

- 암시적변환 : 오라클 자체변환

                   Varchar2, Char -> Number, Date

 

- 명시적변환 : 함수로 변환

                   TO_CHAR,

 

                   Ex. 숫자를 달러 단위로 변환.

                       TO_CHAR('5000', 'fm$99,999.00')

 

                   Ex. 이름, 입사일, 입사한 요일을 디스플레이 하십시오. 열 레이블은 DAY 입니다.

                        결과는 월요일부터 시작하는 요일 순으로 정렬하십시오.

 

  SELECT ename, hiredate, TO_CHAR (hiredate, 'DAY') DAY
    FROM scott.emp
ORDER BY TO_CHAR (hiredate - 1, 'D')

      

                   TO_NUMBER,

                   TO_DATE

 

● NVL 함수

- NVL(value, 1) : value가 null일 경우       1을 반환,

                                null이 아닐 경우 value값을 반환.

- NVL2(value, A, B) : value가 null일 경우        A를 반환,

                                      null이 아닐 경우 B를 반환.

 

★★★ NVL의 내부 argument는 서로 데이터형이 맞아야 한다.

 

SELECT ename, NVL(TO_CHAR(comm), 'NO Commission') comm
  FROM scott.emp

 

또는

 

 SELECT ename, NVL(comm,0) comm
  FROM scott.emp

 

Comments