연산자의 종류
산술연산자
산술연산의 결과는 숫자 또는 NULL이다. 산술 연산자는 일반적인 사칙연산을 말한다.
논리연산자
논리 연산자는 TRUE, FALSE와 같은 논리 연산과 관련된 연산자이다.
논리연산자로는 AND, OR, NOT이 있다.
- TRUE, FALSE, NULL을 피연산자로 하는 AND, OR, NOT 연산 결과
x | y | x AND y | x OR y | NOT x |
TRUE | TRUE | TRUE | TRUE | FALSE |
TRUE | FALSE | FALSE | TRUE | FALSE |
TRUE | NULL | NULL | TRUE | FALSE |
FALSE | TRUE | FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE | FALSE | TRUE |
FALSE | NULL | FALSE | NULL | TRUE |
NULL | TRUE | NULL | TRUE | NULL |
NULL | FALSE | FALSE | NULL | NULL |
NULL | NULL | NULL | NULL | NULL |
글자색이 주황색인 부분이 NULL애 대한 모든 연산의 결과는 NULL이다 라는 원칙대로 처리되지 않는 경우다.
Short-Circuit Evaluation(단락 회로 평가, 간략 계산법...)
논리연산에 적용되는 원칙 중 Short-Circuit Evaluation이라는 원칙이 있다.
한 표현식에 여러 개의 논리 연산이 연속하여 나타나는 경우 앞의 논리연산에서 전체 연산의 결과를 미리 알 수 있다면 뒤따르는 연산을 하지 않고 연산을 종료하는 원칙이다.
이 원칙은 미묘한 부분이 있는데 먼저 평가되는 연산의 결과값에 따라 예외가 발생할 수 있고, 발생하지 않을 수도 있다.
DECLARE
x NUMBER := 1;
y NUMBER := 2;
z NUMBER := 0;
BEGIN
-- "TRUE or ?"이므로 "y/z = 0"이 평가되지 않아서 오류가 발생하지 않음
IF x = 1 OR y/z = 0 THEN
DBMS_OUTPUT_PUT_LINE('x = 0 OR y/z = 0');
END IF;
-- 이번에는 "FALSE or ?"이므로 "y / z = 0"이 평가되어 "ORA-01476: 제수가 0입니다."가 발생
x := 2;
IF x = 1 OR y / z = 0 THEN
DBMS_OUTPUT_PUT_LINE('x = 0 OR y / z = 0');
END IF;
END;
위 프로그램을 실행해 보면 13번 줄에서 예외가 발생한다.
프로그램의 7번 줄의 연산과 12번 줄의 연산은 글자 하나 틀리지 않고 동일하며 논리 연산에 사용되는 변수 x의 값만 다를 뿐이다. 7번 줄에서도 z는 0이므로 y / z는 0으로 나누게 되어 계산이 불가능한 것도 동일하다
하지만 Short-Circuit Evaluation 원칙에 의해 7번 줄에서는 y / z를 평가하지 않기 때문에 예외가 발생하지 않는다
연결 연산자
두 개의 문자열을 연결하여 하나의 문자열로 만들 때 사용된다.
연결 연산자의 결과는 문자열 또는 NULL이다. 연결연산자에서도 NULL에 대한 모든 연산의 결과는 NULL이라는 원칙이 적용되지 않는다. NULL을 임의의 문자열과 연결하면 그냥 무시된다.
오라클은 문자열 연결을 위해 연결연산자 || 외에도 CONCAT이라는 함수를 제공한다.
BEGIN
DBMS_OUTPUT_PUT_LINE('Hello ' || 'World');
DBMS_OUTPUT_PUT_LINE('Hello ' || NULL || 'World'); -- NULL에 대한 연결 연산은 무시됨
DBMS_OUTPUT_PUT_LINE(24 || '시간'); -- 숫자 24를 문자로 묵시적 변환 후 연결
DBMS_OUTPUT_PUT_LINE(CONCAT(24 || '시간')); -- 숫자 24를 문자로 묵시적 변환 후 연결
END;
비교 연산자
값을 비교하여 논리값(TRUE, FALSE, NULL)을 결정한다. 연산자 중 비교연산자의 수가 가장 많다.
- 비교연산자의 종류
종류 | 연산자 |
관계 연산 | =, <>, !=, ~=, ^=, <, >, <=, >= |
NULL 여부 검사 | IS NULL, IS NOT NULL |
유사 비교 | LIKE, NOT LIKE |
범위 비교 | BETWEEN, NOT BETWEEN |
포함 비교 | IN, NOT IN |
BOOLEAN 표현식
BOOLEAN값 즉, TRUE나 FALSE 또는 NULL을 반환하는 표현식
가장 간단하게는 BOOLEAN형 리터럴인 TRUE와 FALSE을 들 수 있으며, 좀 더 복잡한 표현식으로는 다음 같은 표현식을 들 수 있다.
NOT BOOLEAN표현식
BOOLEAN표현식 { AND | OR } BOOLEAN표현식
-BOOLEAN 표현식 예
DECLARE
v_bool BOOLEAN;
BEGIN
v_bool := FALSE;
-- IF문의 분기 조건 판단에 사용
IF v_bool = TRUE THEN
DBMS_OUTPUT_PUT_LINE('v_bool이 참입니다');
ELSE
DBMS_OUTPUT_PUT_LINE('v_bool이 거짓입니다');
END IF;
v_bool := FALSE;
-- WHILE문의 순환 조건 판단에 사용
WHILE v_bool = FALSE
LOOP
v_bool := TRUE;
END LOOP;
v_bool : = FALSE;
--BOOLEAN 표현식에 NOT 사용
WHILE NOT v_bool = FALSE
LOOP
v_bool := TRUE;
END LOOP;
END;
CASE 표현식
조건에 따라 여러 값 중에서 하나를 선택하는 기능을 제공하는 표현식
- 단순 CASE 표현식: 하나의 선택자에 대한 선택값에 따라 결과값을 선택하는 구조를 가진다.
CASE 선택자
WHEN 선택값1 THEN 결과값1
WHEN 선택값2 THEN 결과값2
...
WHEN 선택값n THEN 결과값n
[ ELSE else결과값 ]
END
DECLARE
v_bool BOOLEAN := TRUE;
v_str STRING(100);
BEGIN
-- 단순 CASE 표현식
v_str := CASE v_bool WHEN TRUE THEN 'v_bool is TRUE'
WHEN FALSE THEN 'v_bool is FALSE'
ELSE 'v_bool is NULL'
END;
DBMS_OUTPUT_PUT_LINE(v_str);
END;
- 조사 CASE 표현식: 조건식을 나열하고 조건식이 TRUE일 경우에 이에 대한 결과값을 선택하는 표현식
CASE 선택자
WHEN 조건식1 THEN 결과값1
WHEN 조건식2 THEN 결과값2
...
WHEN 조건식n THEN 결과값n
[ ELSE else결과값 ]
END
DECLARE
v_bool BOOLEAN := TRUE;
v_str STRING(100);
BEGIN
-- 조사 CASE 표현식
v_str := CASE WHEN v_bool = TRUE THEN 'v_bool is TRUE'
WHEN v_bool = FALSE THEN 'v_bool is FALSE'
ELSE 'v_bool is NULL'
END;
DBMS_OUTPUT_PUT_LINE(v_str);
END;
두 유형 모두 여러 개의 WHEN이 연속적으로 사용되는 경우에는 나타나는 순서에 의해 순차적으로 검사된다.
두 개 이상의 선택값이 선택자와 일치하거나, 두 개 이상의 조건식이 참인 경우라면 그중에서 순서상 먼저 나타나는 WHEN이 적용된다.
CASE는 지금까지 살펴본 표현식뿐만 아니라 CASE문으로도 사용가능하다.
CASE문은 나중에 제어문 공부할 때 알아볼 것이다.
PL/SQL에서 내장 SQL 함수의 사용
오라클은 SQL 표준에서 정의한 함수와 오라클 확장 함수를 포함하여 매우 많은 내장 SQL 함수를 제공한다.
PL/SQL에서는 오라클이 제공하는 대부분의 내장 SQL 함수를 사용할 수 있다.
PL/SQL에서 사용할 수 없는 SQL함수는 SUM, COUNT와 같은 집계함수, 분석함수, 데이터 마이닝과 관련된 함수, 모델 관련 함수 등이 있다. PL/SQL에서 사용할 수 없다는 의미는 PL/SQL에서 직접 사용할 수 없다는 것을 의미할 뿐이며 임베디드 SQL을 통해서는 사용이 가능하다. PL/SQL에서 사용할 수 없는 함수의 예로는 DECODE함수가 있다.
PL/SQL애서는 DECODE 대신 CASE를 사용해야 한다.
'DATABASE > SQL, PL-SQL' 카테고리의 다른 글
SQL - MERGE, DELETE문의 사용 (0) | 2021.01.25 |
---|---|
SQL - SELECT, INSERT, UPDATE 사용 (0) | 2021.01.25 |
표현식 - 1 (0) | 2021.01.24 |
변수와 상수, 리터럴 (0) | 2021.01.20 |
앵커(%)를 사용한 데이터 타입 지정 (0) | 2021.01.19 |
댓글