[SQL] 변환 함수 및 조건부 표현식

·2025년 5월 23일

SQL

목록 보기
4/126

1. 암시적 데이터 유형 변환

Oracle 서버에서
NUMBER나 DATE는 VARCHAR2 또는 CHAR로 자동으로 변환가능

2. 명시적 데이터 유형 변환

CHAR -> DATE : TO_DATE
CHAR -> NUMBER : TO_NUMBER
DATE -> CHAR : TO_CHAR
NUMBER -> CHAR : TO_CHAR

2-1. 날짜에 TO_CHAR 함수 사용

TO_CHAR(date|, 'format model'|)

  • 작은 따옴표(' ')로 묶어야 됨
  • 대소문자 구분함
  • 임의의 유효한 날짜 형식 요소 포함 가능
  • 채워진 공백을 제거하거나 선행 0을 출력하지 않는 fm 요소를 가짐
  • 콤마(,)로 날짜 값과 구분
SELECT SYSDATE
      ,TO_CHAR(SYSDATE, 'YYYY')
      ,TO_CHAR(SYSDATE, 'MM/DD')
      ,TO_CHAR(SYSDATE, 'Month DD, YYYY')
  FROM dual ;
  
/*
2025/05/23 21:37:54
2025
05/23
5월  23, 2025
*/
-- language를 영어로 바꿈
ALTER SESSION SET NLS_LANGUAGE = AMERICAN ;

SELECT last_name,
       TO_CHAR(hire_date, 'fmDD Month YYYY'),
	   TO_CHAR(hire_date, 'DD Month YYYY')
FROM   employees;
  • fm은 공백을 제거해줌

날짜 형식 모델의 요소

  • 시간 요소는 날짜에서 시간 부분의 형식을 지정
    HH24:MI:SS AM --> 15:45:32 PM
  • 문자열은 큰따옴표로 묶어 추가
    DD "of" MONTH --> 12 of OCTOBER
  • 숫자 접미어는 숫자를 영어 철자로 표기
    • spth를 붙여줌
      ddspth --> fourteenth

2-2. 숫자에 TO_CHAR 함수 사용

TO_CHAR(number|, 'format model'|)

9: 숫자를 나타냄
0: 0이 표시되도록 강제 적용
$: 부동 달러 기호 배치
L: 부동 로컬 통화 기호 사용
.: 소수점 출력
,: 천 단위 표시자로 쉼표 출력

SELECT last_name, salary
      ,TO_CHAR(salary, '$99,999.00')
      ,TO_CHAR(salary, '$00,000.00')
  FROM employees ;


SELECT last_name, salary
      ,TO_CHAR(salary, 'L99,999.00')
  FROM employees ;

2-2-1. TO_NUMBER 및 TO_DATE 함수 사용

SELECT TO_NUMBER('$15,000','$99,999') + TO_NUMBER('$20,000','$99,999')
  FROM dual ;
  
  
SELECT '01-JAN-21'
      ,TO_DATE('01-JAN-21','DD-MON-RR')
  FROM dual ;
SELECT last_name, hire_date
FROM   employees
WHERE  hire_date = TO_DATE('June     17, 1987', 'Month DD, YYYY');

-- 공백까지 모두 일치해야 결과가 나옴(fx수정자 사용)
SELECT last_name, hire_date
FROM   employees
WHERE  hire_date = TO_DATE('June     17, 1987', 'fxMonth DD, YYYY');


SELECT last_name, hire_date
FROM   employees
WHERE  hire_date = TO_DATE('June 17, 1987', 'fxMonth DD, YYYY');  

ㄴ fx 수정자를 가짐(딱히 쓰임새가 있지는 x)

3. 일반 함수

임의의 데이터 유형을 사용하며, null 사용과 관련있음

NVL(expr1, expr2)
NVL2(expr1, expr2, expr3)
NULLIF(expr1, expr2)
COALESCE(expr1, expr2, ..., exprn)

3-1. NVL 함수

null 값을 실제 값으로 변환
null인 경우만 가능

  • 사용할 수 있는 데이터 유형: 날짜, 문자 및 숫자
  • 데이터 유형이 일치해야 함
    • NVL(commission_pct, 0)
    • NVL(hire_date, '01-JAN-97')
    • NVL(job_id, 'No Job Yet')
      • job_id에 null이 있다면 'No Job Yet'이 문자를 넣어줘라
SELECT last_name, commission_pct, NVL(commission_pct,0)
  FROM employees 
 WHERE department_id IN (50, 80) ;


SELECT last_name, salary, commission_pct
      ,(salary*12) + ((salary*12)*commission_pct) 
      ,(salary*12) + ((salary*12)*NVL(commission_pct,0)) 
  FROM employees 
 WHERE department_id IN (50, 80) ;

3-2. NVL2 함수

NVL함수에서 확장됨
null인 경우null이 아닌 경우 모두 조절 가능

3-3. NULLIF 함수

두 값이 같으면, null 리턴
같지 않으면, 첫번째 표현식의 결과를 리턴

3-4. COALESCE 함수

  • 여러 개의 대체 값 수용가능
  • 첫번째 표현식이 null이 아닌 경우 COALESCE 함수는 해당 표현식을 반환
    그렇지 않은 경우, 나머지 표현식에 COALESCE를 수행

4. 조건부 표현식

  • SQL문에서 IF-THEN-ELSE 논리 사용 가능
    • CASE 식
    • 검색된 CASE 표현식
    • DECODE 함수
      💡case문decode문은 SQL에서 매우 중요한 조건문!

4-1. CASE 식

CASE expr WHEN comparison expr1 THEN return expr1
		  [WHEN comparison expr2 THEN return expr2
           WHEN comparison exprn THEN return exprn
           ELSE else_expr]
END
SELECT last_name, job_id, salary, 
       CASE job_id WHEN 'AD_PRES' THEN salary * 1.1 
                   WHEN 'AD_VP'   THEN salary * 1.15
                   WHEN 'IT_PROG' THEN salary * 1.2 
                   ELSE salary * 1.05 END AS new_salary
  FROM employees ;


SELECT last_name, job_id, salary, 
       CASE  WHEN job_id = 'AD_PRES' THEN salary * 1.1 
             WHEN job_id = 'AD_VP'   THEN salary * 1.15
             WHEN job_id = 'IT_PROG' THEN salary * 1.2 
             ELSE salary * 1.05 END AS new_salary
  FROM employees ;


SELECT last_name, job_id, salary, 
       CASE  WHEN salary <=  5000 THEN '평균 이하' 
             WHEN salary <= 10000 THEN '평균'
             WHEN salary <= 20000 THEN '평균 이상'
             ELSE '최상급' END AS grade
  FROM employees ;

4-2. DECODE 함수

같은 값만 비교할 수 있음 --> 그래서 CASE문을 더 많이 씀

DECODE(column, 조건1, 출력1,
			   조건2, 출력2,
               ...,
               출력_fin)
SELECT last_name, job_id, salary, 
       DECODE(job_id, 'AD_PRES' ,salary * 1.1 
                    , 'AD_VP'   ,salary * 1.15
                    ,'IT_PROG'  ,salary * 1.2 
                    ,salary * 1.05) AS new_salary
  FROM employees ;

0개의 댓글