개인 공부 (23.07~

[SQL] 날짜 함수, CASE 문

Song쏭 2023. 11. 9. 13:40

INDEX

1. 현재 시간 출력

2. 날짜형 간의 뺄셈

3. 현재 날짜에서 1일 후

4. CASE문 (검색 CASE)

5. COALESCE

6. 또 하나의 CASE문 (단순 CASE)

7. 단순 CASE로는 NULL값을 비교할 수 없다.


1. 현재 시간 출력

SELECT CURRENT_TIMESTAMP;

2023-11-09 12:46:55

 

* 날짜 데이터는 서식을 지정할 수 있다.

(문자열 데이터, 날짜형 데이터)

 

2. 날짜형 간의 뺄셈

SELECT DATEDIFF('2023-01-31','2023-01-01');

30

 

3. 현재 날짜에서 1일 후

SELECT CURRENT_DATE + INTERVAL 1 DAY;

2023-11-10

 

4. CASE문 (검색 CASE)

CASE문으로 데이터 변환하기

 

SELECT a,
       CASE
           WHEN a IS NULL
               THEN 0
           ELSE a
           END "a(null=0)"
FROM sample37;

a 컬럼에 NULL이 존재하므로 NULL이 존재하는 데이터는 0으로 표시된다.

그러나 NULL자리에 3이라는 값이 존재했다면,

ELSE에 의해 a 컬럼에 있는 값이 그대로 표시되어

우측에 3이 표시된다.

 

5. COALESCE

위 예시처럼 NULL 값을 반환하는 경우라면

COALESCE 함수를 사용하는 편이 더 쉽다.

 

NULL 값을 반환하는 함수도 있다.

Oracle에서는 NVL함수,

SQL Server에서는 ISNULL 함수가 이에 해당한다.

다만 이 함수들은 특정 데이터베이스에 국한된 함수인 만큼

NULL 값을 변환할 때는 표준 SQL로 규정되어 있는 COALESCE함수를 사용한다.

 

SELECT a, COALESCE(a,0) FROM SAMPLE37;

COALESCE는 주어진 인수 가운데 NULL이 아닌 값에 대해서는 가장 먼저 지정된 인수의 값을 반환하는 함수이다.

쿼리에서 a가 NULL이 아니면 a값을 그대로 출력하고

그렇지 않으면 (a가 NULL이면) 0을 출력한다.

 

동일한 결과를 도출해낼 수 있다.

 

6. 또 하나의 CASE문 (단순 CASE)

숫자로 이루어진 코드를 알아보기 더 쉽게 문자열로 변환하고 싶은 경우 CASE문을 많이 이용한다.

문자화하는 것을 디코드라고 부르고

반대로 수치화하는 것을 인코드라고 부른다.

 

* CASE 문에는 2개의 구문이 있다.

검색 CASE단순 CASE 두 개 구문으로 나눌 수 있다.

 

<검색 CASE> 

       CASE
           WHEN 조건식
               THEN 식
           ELSE 식
           END
FROM sample37;

 

<단순 CASE>

       CASE 식
           WHEN 식
               THEN 식
           ELSE 식
           END
FROM sample37;

 

단순 CASE에서는 CASE 뒤에 식을 기술하고 WHEN 뒤에 조건식이 아닌 식을 기술한다.

 

* 검색 CASE 예시

SELECT a       AS "코드",
       CASE
           WHEN a = 1 THEN '남자'
           WHEN a = 2 THEN '여자'
           ELSE '미지정'
           END AS "성별"
FROM sample37;

 

* 단순 CASE 예시

SELECT a       AS "코드",
       CASE a
           WHEN 1 THEN '남자'
           WHEN 2 THEN '여자'
           ELSE '미지정'
           END AS "성별"
FROM sample37;

 

CASE는 SELECT 구 뿐만 아니라,

WHERE 구에서 조건식의 일부로 사용될 수도 있고

ORDER BY구에서도 사용할 수 있다.

 

ELSE를 생략하면 ELSE NULL이 되는 것에 주의하자!

ELSE를 생략하지 말고 지정하는 편이 좋다.

 

7. 단순 CASE로는 NULL값을 비교할 수 없다.

SELECT a       AS "코드",
       CASE a
           WHEN 1 THEN '남자'
           WHEN 2 THEN '여자'
           WHEN NULL THEN '데이터 없음' //이런식으로 표현 불가능!!!
           ELSE '미지정'
           END AS "성별"
FROM sample37;

 

NULL이라는 문자로 인식해서 계산을 하기 때문에 모른다.

그렇다고 WHEN IS NULL THEN~ 이런식으로 하면 1과 2가 단순 CASE로 되어있기 때문에

문법오류가 발생한다.

따라서, NULL값을 비교하려면 검색 CASE를 사용해야한다.

 

SELECT a       AS "코드",
       CASE 
           WHEN a=1 THEN '남자'
           WHEN a=2 THEN '여자'
           WHEN a IS NULL THEN '데이터 없음'
           ELSE '미지정'
           END AS "성별"
FROM sample37;

 

 

SQL첫걸음 책 공부 중