본문 바로가기

Oracle/12일

12일차 3


>> Oracle Functions

http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions.htm#i1482196

 

> Numeric Functions


1) CEIL : 올림

SELECT  CEIL(3.141592), CEIL(3.98), CEIL(3)
  FROM DUAL;
 CEIL(3.141592) CEIL(3.98) CEIL(3)
 -------------- ---------- -------
              4          4       3

2) FLOOR : 내림

SELECT FLOOR(15.7), FLOOR(15.1), FLOOR(16)
  FROM DUAL;
 FLOOR(15.7) FLOOR(15.1) FLOOR(16)
 ----------- ----------- ---------
          15          15        16

 
3) MOD : 나머지
SELECT MOD(11,4) "Modulus"
  FROM DUAL;
 Modulus
 -------
       3

 
4) NANVL : ?

5) ROUND : 반올림

SELECT ROUND(15.193,1), ROUND(15.193,2), ROUND(15.193), ROUND(15.193,-1) 
FROM DUAL;
 ROUND(15.193,1) ROUND(15.193,2) ROUND(15.193) ROUND(15.193,-1)
 --------------- --------------- ------------- ----------------
            15.2           15.19            15               20

6) TRUNC : 버림

SELECT TRUNC(15.79,1),TRUNC(15.79,-1) 
FROM DUAL;
 TRUNC(15.79,1) TRUNC(15.79,-1)
 -------------- ---------------
           15.7              10

 

> Character Functions Returning Character Values


1) CHR

SELECT CHR(67)||CHR(65)||CHR(84) "Dog"
  FROM DUAL;
 Dog
 ---
 CAT

2) CONCAT : concatenation 연결

SELECT CONCAT(CONCAT(last_name, '''s job category is '), job_id) "Job" 
  FROM employees 
  WHERE employee_id = 200;
  
SELECT last_name||'''s job category is '|| job_id AS  "Job" 
  FROM employees 
  WHERE employee_id = 200;
 Job
 --------------------------------
 Whalen's job category is AD_ASST

 
3) INITCAP : 첫글자만 대문자로 나머지는 소문자
SELECT INITCAP('the soap') "Capitals"
  FROM DUAL; 
 Capitals
 --------
 The Soap
SELECT email, INITCAP(email)
FROM employees;
 EMAIL    INITCAP(EMAIL)
 -------- --------------
 AHUNOLD  Ahunold
 BERNST   Bernst
 CDAVIES  Cdavies
 DLORENTZ Dlorentz
 EABEL    Eabel
 EZLOTKEY Ezlotkey
 JTAYLOR  Jtaylor
 JWHALEN  Jwhalen
 KGRANT   Kgrant
 KMOURGOS Kmourgos
 LDEHAAN  Ldehaan
 MHARTSTE Mhartste
 NKOCHHAR Nkochhar
 PFAY     Pfay
 PVARGAS  Pvargas
 RMATOS   Rmatos
 SHIGGINS Shiggins
 SKING    Sking
 TRAJS    Trajs
 WGIETZ   Wgietz

4) LOWER : 모두 소문자로

SELECT LOWER('MR. SCOTT MCMILLAN') "Lowercase"
  FROM DUAL;

 
5) UPPER : 모두 대문자로
SELECT last_name, UPPER(last_name) "Uppercase"
   FROM employees;

6) LPAD : left-padded to length (주어긴 길이에 남는공간을 정한 패턴으로 왼쪽부터 채워)

SELECT LPAD('Page 1',15,'*.') "LPAD example"
  FROM DUAL;
 LPAD example
 ---------------
 *.*.*.*.*Page 1
SELECT LPAD('Page 1',15,'0') "LPAD example"
  FROM DUAL;
 LPAD example
 ---------------
 000000000Page 1

7) RPAD

SELECT last_name, salary, salary/1000/1, RPAD(' ', salary/1000/1, '*') "Salary"
   FROM employees
   WHERE department_id = 80
   ORDER BY last_name, "Salary";
 LAST_NAME SALARY SALARY/1000/1 Salary
 --------- ------ ------------- -----------
 Abel       11000            11  **********
 Taylor      8600           8.6  *******
 Zlotkey    10500          10.5  *********


  
8) TRIM
SELECT employee_id, hire_date,
      TO_CHAR(TRIM(LEADING 0 FROM hire_date))
      FROM employees
      WHERE department_id = 60
      ORDER BY employee_id;       
 EMPLOYEE_ID HIRE_DATE             TO_CHAR(TRIM(LEADING0FROMHIRE_DATE))
 ----------- --------------------- ------------------------------------
         103 1990-01-03 00:00:00.0 90/01/03
         104 1991-05-21 00:00:00.0 91/05/21
         107 1999-02-07 00:00:00.0 99/02/07
         
select trim('H' from 'Hello WorldHHHHHH')   
from DUAL;
 TRIM('H'FROM'HELLOWORLDHHHHHH')
 -------------------------------
 ello World
 

     
9) LTRIM

SELECT LTRIM('<=====>BROWNING<=====>', '<>=') "LTRIM Example" 
  FROM DUAL;
 LTRIM Example
 ---------------
 BROWNING<=====>

10) RTRIM

SELECT RTRIM('<=====>BROWNING<=====>', '>=<') "RTRIM Example"
  FROM DUAL;
 RTRIM Example
 ---------------
 <=====>BROWNING

 
TRIM은 한글자만 가능하나, LTRIM/RTRIM은 패턴이 가능해.
 
11) REPLACE
SELECT REPLACE('JACK and JUE','J','BL') "Changes"
     FROM DUAL;
 Changes
 --------------
 BLACK and BLUE

12) SUBSTR

SELECT SUBSTR('ABCDEFG',3,4) "Substring" --3번째부터 4개만 남긴다
     FROM DUAL;
 Substring
 ---------
 CDEF
SELECT SUBSTR('ABCDEFGHI',-5,4) "Substring" --오른쪽 5번째부터 4개만 남긴다
     FROM DUAL;
 Substring
 ---------
 EFGH

 

> Character Functions Returning Number Values


1) ASCII
--L로 시작하는 사람 출력

SELECT last_name
  FROM employees
  WHERE ASCII(SUBSTR(last_name, 1, 1)) = 76 --76:L
  ORDER BY last_name;
 LAST_NAME
 ---------
 Lorentz

 
 

> Datetime Functions


-. SYSDATE : 년월일시분초. 내부적으로 DATE type(7byte)사용
-. TO_CHAR (datetime) : 날짜를 문자열로
-. TO_DATE : 문자열을 날짜로

    cf)
        DATE type : 7byte - 년(2) 월(1) 일(1) 시(1) 분(1) 초(1byte)
        TIMESTAMP type: 9byte - 년(2) 월(1) 일(1) 시(1) 분(1) 초(3byte)
       

SELECT TO_CHAR
    (SYSDATE, 'YYYY-MM-DD HH24:MI:SS') "NOW", sysdate
     FROM DUAL;
 NOW                 SYSDATE
 ------------------- ---------------------
 2012-06-10 16:47:50 2012-06-10 16:47:50.0
SELECT SYSDATE+10 FROM DUAL; 
--날짜가 10일 더해져..

--백일 계산
SELECT TO_DATE('2013-01-01', 'YYYY-MM-DD') + 100
FROM DUAL;

--태어난지 몇일 됐지?
SELECT SYSDATE-TO_DATE('2004-05-21', 'YYYY-MM-DD') 
FROM DUAL;
    

90년대 입사자구하기

SELECT last_name, TO_CHAR(hire_date, 'YYYY/MM/DD') AS hiredate
FROM employees
WHERE TO_DATE('1990-01-01', 'YYYY-MM-DD') <= hire_date
  AND hire_date < TO_DATE('2000-01-01', 'YYYY-MM-DD');  
 LAST_NAME HIREDATE
 --------- ----------
 De_Haan   1993/01/13
 Hunold    1990/01/03
 Ernst     1991/05/21
 Lorentz   1999/02/07
 Mourgos   1999/11/16
 Rajs      1995/10/17
 Davies    1997/01/29
 Matos     1998/03/15
 Vargas    1998/07/09
 Abel      1996/05/11
 Taylor    1998/03/24
 Grant     1999/05/24
 Hartstein 1996/02/17
 Fay       1997/08/17
 Higgins   1994/06/07
 Gietz     1994/06/07

 
1990년 입사자를 구하기
SELECT last_name, TO_CHAR(hire_date, 'YYYY/MM/DD') AS hiredate
FROM employees
WHERE TO_CHAR(hire_date, 'YYYY') = '1990'; 

아주 좋지않은 쿼리야..
데이터가 많을 경우 모든 데이터를 변환한 다음에 비교해야잖아.
내부 컬럼에 함수값을 적용하는 것은 피해야 해!!

db엔 Abel이라고 있을 경우

  select * from employees where last_name = 'ABEL'; --조회가 안되지.
  
  select * from employees where UPPER(last_name) = 'ABEL'; --안좋아
  select * from employees where last_name = initcap('ABEL'); --좋아

 
그렇기 때문에 문자열 입력할때도 대소문자등의 포멧을 맞추는게 속도에도 좋아.
들어온 데이터대로 반드시 넣어야 한다면 차라리 컬럼 하나더 만들어 넣는게 좋아.
 

 


SYSTIMESTAMP : TIMESTAMP type사용

SELECT SYSTIMESTAMP FROM DUAL;
SYSTIMESTAMP
---------------------------------
12/08/10 17:22:22.363000 +09:00

 


        cf) RR date format
        표기한 년도가 후반기(50~99년)고 현재년도가 전반기면 : 저장한 데이터는 이 전 세기
        뭐 이런식의 정의가 있어.
       
        아무튼 년도는 YYYY타입으로해.

'Oracle > 12일' 카테고리의 다른 글

12일차 1  (0) 2012.09.20
12일차 2  (0) 2012.09.20
12일차 4  (0) 2012.09.20
12일차 5  (0) 2012.09.20
12일차 6  (0) 2012.09.20