oracle 함수

GW·2023년 8월 9일

⭐⭐TO_CHAR : 날짜를 문자로 바꾼다

⭐⭐TO_DATE : 문자를 날짜로 바꾼다

⭐⭐DISTINCT : 중복행을 제거한다

  • 함수보다는 명령어에 가깝다.
  • 주의점: 조회 컬럼이 많은 SELECT에 DISTINCT를 쓸 경우 성능이 저하된다.
    • 조회 컬럼이 적을 때만 권장.
      SELECT DISTINCT JOB_ID
      FROM EMPLOYEES
      ;
      -- 사원들의 직무 아이디와 부서번호를 중복없이 조회한다.
      SELECT DISTINCT JOB_ID
         , DEPARTMENT_ID
      FROM EMPLOYEES
      ;

⭐CASE WHEN ELSE END : Java의 if와 유사

-- 연봉이 10000이 넘어가면 '특급', 8000 이 어가면 '중급', 4000이 넘어가면 '초급', 그 이하는 '인턴'  

SELECT EMPLOYEE_ID
     , SALARY
     , CASE 
         WHEN SALARY >= 10000 THEN '특급'
         WHEN SALARY >= 8000 THEN '중급'
         WHEN SALARY >= 4000 THEN '초급'
         ELSE '인턴'
       END GRADE
  FROM EMPLOYEES
;
-- 소속부서가 있으면 부서명을 조회하고, 없으면 '대기발령중'으로 조회
-- 사원번호ㅡ 이름, 부서명
SELECT E.EMPLOYEE_ID 
     , E.FIRST_NAME 
     , D.DEPARTMENT_NAME
     , CASE 
     	 WHEN D.DEPARTMENT_NAME IS NOT NULL THEN D.DEPARTMENT_NAME 
     	 ELSE '대기발령중'
     END DEPT_NAME
  FROM EMPLOYEES E
  LEFT JOIN DEPARTMENTS D 
    ON D.DEPARTMENT_ID = E.DEPARTMENT_ID  
;

⭐DECODE :Java의 if와 유사

-- DECODE
-- 만약 JOB_ID가 'IT_PROG' 라면 '개발'
--             'FI_MGR' 라면 경리
--              'FI_ACCOUNT' 라면 '계정'
--              그 외에는 원래값을 조회한다.
-- CASE와 DECODE의 차이
    -- CASE : 비교연산이 가능하다. (무엇보다 크거나 작거나 같다)
    -- DECODE : 오로지 값이 동일한지만 비교 
SELECT JOB_ID
     , DECODE(JOB_ID, 'IT_PROG','개발'
                    , 'FI_MGR','경리' 
                    , 'FI_ACCOUNT','계정'
                    , JOB_ID) JOB_DESC 
  FROM EMPLOYEES 
;

⭐⭐NVL: 값이 NULL일 경우 다른 문자로 대체한다.

  • 주의점: NULL을 대체하는 값의 타입은 비교하려는 컬럼의 타입과 동일해야한다.(NUMBER면 숫자 VARCHAR면 문자 등등)
-- NVL : 값이 NULL 일 경우 다른 문자로 대체한다
-- COMMISSION_PCT 가 NULL 이라면 0으로 조회
SELECT COMMISSION_PCT
     , NVL(COMMISSION_PCT, 0)
  FROM EMPLOYEES e 
;
-- 사원의 부서번호를 조회하는데, 부서번호가 NULL 일 때 -1로 대체해 조회
SELECT DEPARTMENT_ID
     , NVL(DEPARTMENT_ID, -1)
  FROM EMPLOYEES e  
;

SUBSTR

-- SUBSTR : 문자를 잘라낸다
-- 사원의 이름중 첫 글자만 잘라낸다.
SELECT FIRST_NAME
     , SUBSTR(FIRST_NAME,1,1) --첫번째 글자 
     , SUBSTR(FIRST_NAME,2,1) --두번째 글자 
     , SUBSTR(FIRST_NAME,3,1) --세번째 글자 
  FROM EMPLOYEES 
;

LOWER, UPPER

--  LOWER, UPPER
-- LOWER 소문자
-- 사원의 이름과 성을 모두 소문자로 변경
SELECT FIRST_NAME 
     , LAST_NAME 
     , LOWER(FIRST_NAME) L_FIRST_NAME 
     , LOWER(LAST_NAME) L_LAST_NAME 
  FROM EMPLOYEES 
;
-- UPPER 대문자
-- 사원의 이름과 성을 모두 대문자로 변경
SELECT FIRST_NAME 
     , LAST_NAME 
     , UPPER(FIRST_NAME) U_FIRST_NAME 
     , UPPER(LAST_NAME) U_LAST_NAME 
  FROM EMPLOYEES 
;

-- 검색시 많이 사용될 수 있다.

⭐⭐LPAD : 문자의 왼쪽에 지정한 문자들로 채운다

 RPAD: 문자의 오른쪽에 지정한 문자들로 채운다
-- LPAD :LEFT PADDING
-- SEQUENCE (ORACLE)
-- 일렬번호 1->2->3->4->5->6
-- SEQUENCE = 문자열
  -- 형태
    -- 상품의 PK
     -- PR-20230809-0001
      -- PR-20230809-0002

-- 사원의 연봉을 6자리로 표현
-- 012000
-- 004000
SELECT LPAD(SALARY,6,'0')
  FROM EMPLOYEES
;

-- 사원의 이름을 10자리로 표현
-- "--------KI"
SELECT LPAD(FIRST_NAME,10,'-')
  FROM EMPLOYEES 
;

SELECT RPAD(FIRST_NAME,10,'-')
  FROM EMPLOYEES 
;

MOD: 나머지 구한다

-- MOD : 나머지를 구한다.
SELECT MOD(10,2)
  FROM DUAL
;

⭐⭐CONCAT : 문자열을 이어 붙인다.

-- CONCAT : 문자열을 이어 붙인다.
SELECT CONCAT('A','B')
     , 'D'||'F' ASD
FROM EMPLOYEES 
;

-- 사원의 이름과 성을 하나의 컬럼으로 조회하기
SELECT FIRST_NAME ||' '|| LAST_NAME 
  FROM EMPLOYEES 
;

LENGTH : 문자열의 길이를 구한다.

TRUNC : 소수점 이하를 버린다

--LENGTH: 문자열의 길이를 구한다.
SELECT LENGTH('   ') -- 3
     , LENGTH('ㅁㄴㅇ')
  FROM DUAL
;

⭐UNION ALL : 두개 이상의 셀렉트 쿼리를 하나로 합친다

SELECT
  FROM
 WHERE ...
 UNION ALL
SELECT
  FROM
 WHERE ...
 UNION ALL 
 
 -- 150. 사원번호가 100번인 사원의 사원번호, 이름과 사원번호로 내림차순 정렬된 사원의 사원번호, 이름 조회한다.
 SELECT EMPLOYEE_ID , FIRST_NAME 
  FROM EMPLOYEES 
 WHERE EMPLOYEE_ID =100
 UNION ALL 
 SELECT *
 FROM(SELECT EMPLOYEE_ID 
           , FIRST_NAME 
	    FROM EMPLOYEES 
 	   ORDER BY EMPLOYEE_ID DESC)
; -- 전체결과를 ORDER BY해서 INLINE VIEW로 묶어 영향을 안주게 한다.
-- FIRST_NAME이 'A'로 시작하는 사원의 이름, 성을 먼저 조회하고
-- 나머지 인원들의 FIRST_NAME으로 내림차순 정렬해 이름과 성을 조회
SELECT FIRST_NAME 
     , LAST_NAME 
  FROM EMPLOYEES
 WHERE FIRST_NAME LIKE 'A%'
 UNION ALL 
SELECT FIRST_NAME 
     , LAST_NAME 
  FROM(SELECT FIRST_NAME
            , LAST_NAME 
         FROM EMPLOYEES 
        ORDER BY FIRST_NAME DESC)
;
 
 

0개의 댓글