|
|
조건/비교 관련 함수와 연산자 |
|
|
|
1. CASE |
|
CASE 수식은 CUBRID 문장 내에서 조건에 따라서 변하는 값을 얻고자 할 때 사용된다. CASE 수식은 하나 또는 그 이상의 비교 수식과 값 수식이나 쿼리를 참인지 비교한다. 참이면 정해진 수식이나 NULL 값을 반환한다. |
|
1) 구문 |
|
CASE 수식 문법으로 다음과 같은 네 가지 형태가 지원된다. |
CASE control_expression simple_when_list [ else_clause ] END CASE searched_when_list [ else_clause ] END NULLIF ( expression_comma_list ) COALESCE ( expression_comma_list )
simple_when : WHEN expression THEN result
searched_when : WHEN search_condition THEN result
else_clause : ELSE result
result : expression | NULL |
|
|
CASE 문은 하나 또는 그 이상의 simple_when절이나 하나 또는 그 이상의 simple_when 절을 포함한다. NULLIF와 COALESCE 문장은 특정 형태의 조건식으로 사용될 수 있다. 각각의 CASE 문장에서 모든 WHEN 절은 simple_when 절 형태이거나 searched_when 절 형태를 가져야 하며 이 둘을 함께 사용할 수는 없다. CASE 문은 반드시 키워드 END로 끝나야 한다.
처음으로 WHEN 절의 조건이 만족되는 THEN 절의 수식 값이 CASE 수식의 값이 된다. simple_when 절은 WHEN 수식의 값이 CASE 문의 control_expression의 값과 같을 때 만족된다. searched_when 절은 해당 search_condition이 참이 되면 만족된다. 어떠한 WHEN 절도 만족되지 않으면, ELSE 절의 값이 CASE 수식의 값이 된다. ELSE 절이 생략된 경우에는 ELSE NULL 절이 주어진 것으로 가정한다.
simple_when 절을 사용한 CASE 수식을 사용하기 위해서는 모든 WHEN 절의 수식이 가지는 데이터 타입이 control_expression의 데이터 타입과 비교 가능해야 한다. 마찬가지로 모든 THEN 절의 수식의 데이터 타입 역시 비교 가능해야 한다. 하지만, WHEN 절과 THEN 절의 데이터 타입이 서로 비교 가능해야 할 필요는 없다.
CASE 수식이 반환하는 값의 데이터 타입은 다음과 같은 규칙에 따라 THEN 절과 선택 사항인 ELSE 절의 데이터 타입에 좌우된다. |
|
모든 THEN 절의 데이터 타입이 같으면, 해당 타입이 CASE 문의 데이터 타입이 된다. |
|
THEN 절의 데이터 타입이 같지 않지만 비교 가능한 경우에는, THEN 절의 데이터 타입 중 가장 일반적인 타입이 CASE 문의 데이터 타입이 된다. |
|
어느 하나라도 THEN 절의 타입이 가변 길이의 문자 스트링 또는 비트 스트링인 경우, 결과는 가변 길이가 된다. 가변 길이 스트링이 하나도 쓰이지 않은 경우에는 가장 긴 길이를 가지는 문자 스트링 또는 비트 스트링이 결과로 반환된다. |
|
모든 THEN 절의 타입이 근사값으로 표현되는 수치형이 아니면 결과로 정확한 수치형이 반환된다. 소수점 이하 자릿수는 가장 큰 소수점 이하 자릿수로 결정된다. |
|
결과의 자릿수는 CASE 문의 모든 THEN 절에서 명시된 것들의 가장 작은 것부터 가장 큰 것까지 모두를 포함할 수 있도록 결정된다 |
|
2) 예제 |
|
다음은 선수의 성별이 M이면 'MAN'을 W면 'WOMAN'을 출력하는 예제이다. |
SELECT name, CASE WHEN gender = 'M' THEN 'MAN' WHEN gender = 'W' THEN 'WOMAN' END as GENDER FROM athlete; |
|
|
2. NULLIF와 COALESCE 함수 |
|
NULLIF 와 COALESCE 는 특정한 경우의 CASE 수식을 처리하기 위한 간단한 형태로 조건 수식의 특정한 형태로 사용된다.
NULLIF 문은 두 수식을 비교하여 수식이 같으면 NULL을 반환하고, 그 외에는 첫 번째 인자 값을 반환한다.
NULLIF(a, b)는 다음의 CASE 문장과 같은 의미를 가진다. |
|
CASE WHEN a = b THEN NULL ELSE a END |
|
|
COALESCE 문은 같은 데이터 타입을 가지는 수식 두 개를 인자로 받아서 NULL이 아닌 첫 번째 값을 반환하며, 모든 값이 NULL이면 NULL을 반환한다. COALESCE(a, b)는 다음의 CASE 문장과 같은 의미를 가진다. |
|
CASE WHEN a IS NOT NULL THEN a ELSE b END |
|
|
COALESCE 문장에 두 개 보다 많은 수식을 명시하는 것은 CASE 문장에 THEN 절을 추가하는 것과 같은 의미를 지닌다. 수식 리스트에서 순차적으로 NULL 값인지를 조사하여 NULL이 아닌 값을 만날 때까지 진행한다. 더 이상 수식이 남아 있지 않으면 COALESCE는 NULL을 반환한다. |
|
2) 예제 |
|
다음은 mascot 속성의 값이 'HODORI'면 NULL을, 그 외에는 그 값을 반환하는 예제이다. |
SELECT host_year, NULLIF(mascot, 'HODORI') FROM olympic; |
|
|
다음은 mascot 속성의 값이 NULL이 아니면 그 값을, NULL이면 'Not Exist'를 반환하는 예제이다. |
SELECT host_year, COALESCE(mascot, 'Not Exist') FROM olympic; |
|
|
3. NVL, NVL2 함수 |
|
NVL 함수와 NVL2 함수는 NULL을 지정된 대체 값으로 바꾼다. |
|
1) 구문 |
NVL ( expr, expr2 ) NVL2 ( expr, expr1, expr2 ) |
|
|
NVL 함수는 만약 expr의 값이 NULL이면 expr2의 값을 반환하고 NULL이 아니면 expr의 값을 그대로 반환한다. |
|
NVL2 함수는 만약 expr의 값이 NULL이면 expr1의 값을 반환하고 NULL이 아니면 expr2의 값을 그대로 반환한다. |
|
expr : NULL일 경우 대체할 값을 지정한다. |
|
expr1 : expr의 값이 NULL이 아닌 경우 반환할 값을 지정한다. |
|
expr2 : expr의 값이 NULL일 경우 반환할 값을 지정한다. |
|
2) 예제 |
|
다음은 mascot 속성의 값이 NULL이 아니면 그 값을, NULL이면 'Not Exist'를 반환하는 예제이다. |
SELECT host_year, NVL( mascot, 'Not Exist' ) FROM olympic; |
|
|
다음은 mascot 속성의 값이 NULL이 아니면 'Exist'를, NULL이면 'Not Exist'를 반환하는 예제이다. |
SELECT host_year, NVL2( mascot, 'Exist', 'Not Exist' ) FROM olympic; |
|
|
4. DECODE 함수 |
|
DECODE 함수는 IF-THEN-ELSE 문장과 같은 기능을 제공한다. |
|
DECODE ( expression, search, result [, search, result]* [, default] ) |
|
|
expression : 비교할 값을 지정한다. |
|
search : expression과 비교할 값을 지정한다. |
|
result : expression과 search가 같을 경우에 반환할 값을 지정한다. |
|
default : 같은 것이 발견되지 않으면 반환할 값을 지정한다. default가 생략된 채로 같은 것이 존재하지 않으면 NULL을 반환한다. |
|
search 값 NULL이 expression의 값 NULL과 같은 것으로 처리되는 것에 유의해야 한다. |
|
2) 예제 |
|
다음은 문자열의 길이가 4면 'length: 4', 5면 'length: 5', 6이면 'length: 6'을 반환하는 예제이다. |
SELECT DECODE( LENGTH('Korea'), 4, 'length: 4', 5, 'length: 5', 6, 'length: 6', 'length: unknown') FROM db_root; === <Result of SELECT Command in Line 1> === decode( LENGTH('Korea'), 4, 'length: 4', 5, 'length: 5', 6, 'length: 6', 'length: unknown') ============================================================================================ 5 1 rows selected. |
|
|
5. GREATEST 함수 |
|
GREATEST 함수는 인자 목록 중에서 가장 큰 값을 반환하는 함수이다. |
|
GREATEST ( expression [, expression]* ) |
|
|
expression : 하나 이상의 값을 나열한다. 모든 인자들은 반드시 비교 가능한 타입이어야 한다. 모든 인자가 같은 타입이면, 인자의 타입이 결과로 반환된다. 그렇지 않은 경우에는 다음과 같은 규칙에 따라 반환 값의 타입이 결정된다. 인자가 VARCHAR 또는 CHAR 타입인 경우, 반환 값의 타입은 가장 긴 수식의 길이를 가지는 VARCHAR 타입이다. VARCHAR 타입이 존재하지 않으면 CHAR 타입으로 결과가 반환된다. 인자들 중에 근사값으로 표현되는 수치형이 존재하면, 결과 역시 근사값으로 표현되는 수치형이 반환된다. |
|
2) 예제 |
|
다음은 1988 올림픽에서 한국이 획득한 각 메달의 수와 최대 메달의 수를 반환하는 예제이다. |
SELECT GREATEST (gold, silver, bronze) FROM participant WHERE host_year=1988 AND nation_code = 'KOR'; === <Result of SELECT Command in Line 1> === greatest (gold, silver, bronze) =============================== 12 1 rows selected. |
|
|
6. LEAST 함수 |
|
LEAST 함수는 인자 리스트 중에서 가장 작은 값을 반환하는 함수이다. |
|
LEAST ( expression [, expression]* ) |
|
|
expression : 하나 이상의 값을 나열한다. 모든 인자들은 반드시 비교 가능한 타입이어야 한다. 모든 인자가 같은 타입이면, 인자의 타입이 결과로 반환된다. 그렇지 않은 경우에는 다음과 같은 규칙에 따라 반환 값의 타입이 결정된다. 인자가 VARCHAR 또는 CHAR 타입인 경우, 반환 값의 타입은 가장 긴 수식의 길이를 가지는 VARCHAR 타입이다. VARCHAR 타입이 존재하지 않으면 CHAR 타입으로 결과가 반환된다. 인자들 중에 근사값으로 표현되는 수치형이 존재하면, 결과 역시 근사값으로 표현되는 수치형이 반환된다. |
|
2) 예제 |
|
다음은 1988 올림픽에서 한국이 획득한 각 메달의 수와 최소 메달의 수를 반환하는 예제이다. |
SELECT LEAST(gold, silver, bronze) FROM participant WHERE host_year=1988 AND nation_code = 'KOR'; === <Result of SELECT Command in Line 1> === least (gold, silver, bronze) ============================ 10 1 rows selected. |
|
|