SQL | Flow Control Functions - 조건문

ja_efan·2024년 1월 29일
0

SQL

목록 보기
4/5
post-thumbnail

흐름 제어 연산자


MySQL의 4가지의 흐름 제어 연산자가 있다.

NameDescription
CASECase operator
IF()if/else construct
IFNULL()Null if/else construct
NULLIF()Return NULL if expr1=expr2

CASE


형식 1

CASE value WHEN compare_value THEN result [WHEN campare_value THEN result ...][ELSE result] END

형식 2

CASE WHEN condition THEN result [WHEN condition THEN result...][ELSE result] END

첫 번째 형식의 CASE는 value와 compare_value의 비교 값이 True일 경우 result를 반환한다.

두 번째 CASE는 해당 절의 첫 번째 condition이 True일 경우 result를 반환한다.

만약 비교 값이나 condition이 True가 아닌 경우 ELSE 키워드 뒤에 오는 result가 반환되고, 만약 ELSE가 없을 경우 NULL이 반환된다.

예제

SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;
# 결과 : one

SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
# 결과 : true

SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
# 결과 : NULL

IF()


형식

IF(expr1, expr2, expr3)

expr1이 True일 경우 (expr1 <> 0 and expr1 IS NOT NULL), IF()함수는 expr2를 반환하고 나머지 경우에는 expr3를 반환한다.

이중 IF문의 경우 다음과 같이 작성한다.

IF(expr1, expr2, IF(expr3, expr4, expr5))

expr1이 True일 경우 expr2를 반환하며, expr1이 False인 경우 expr3의 값에 따라 expr4 혹은 expr5를 반환한다.

Python으로 코드를 작성하면 다음과 같이 작성할 수 있다.

if expr1:
	expr2
elif expr3:
	expr4
else:
	expr5

예제

SELECT IF(1>2, 2,3);
# 결과 : 3

SELECT IF(1<2, 'yes', 'no');
# 결과 : yes

SELECT IF(STRCMP('test','test1'), 'no', 'yes');
# 결과 : no
💡 STRCMP() 함수는 두 개의 비교 문자열이 동일할 경우 0을 반환하고, 다를 경우 1 혹은 -1을 반환한다. 1과 -1을 반환하는 경우는 나중에 자세히 다루어 보겠다.

IFNULL()


형식

IFNULL(expr1, expr2)

expr1이 NULL이 아닌 경우 expr1을 반환하고, 나머지 경우 expr2를 반환한다.

예제

SELECT IFNULL(1,0);
# 결과 : 1

SELECT IFNULL(NULL, 10);
# 결과 : 10

SELECT IFNULL(1/0, 10);
# 결과 : 10

SELECT IFNULL(1/0, 'yes');
# 결과 : yes

NULLIF()


형식

NULLIF(expr1, expr2)

expr1과 expr2가 동일한 경우 NULL을 반환한다. 나머지의 경우 expr1을 반환한다.

이는 다음과 같이 작성한 CASE문과 동일한 연산을 한다.

CASE WHEN expr1=expr2 THEN NULL ELSE expr1 END

예제

SELECT NULLIF(1,1);
# 결과 : NULL

SELECT NULLIF(1,3);
# 결과 : 1

참고
https://dev.mysql.com/doc/refman/8.0/en/flow-control-functions.html#operator_case

profile
이것저것.

0개의 댓글