Oracle 23c부터 SQL 문에 BOOLEAN 타입을 사용할 수 있습니다.
Oracle Database now supports the ISO SQL standard-compliant BOOLEAN data type. This enables you to store TRUE and FALSE values in tables and use BOOLEAN expressions in SQL statements. The BOOLEAN data type standardizes the storage of Yes and No values and makes it easier to migrate to Oracle Database.
테스트를 위해 아래와 같이 c2 칼럼이 BOOLEAN 타입인 테이블을 생성하겠습니다.
-- 1-1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1 NUMBER, c2 BOOLEAN);
INSERT INTO t1 VALUES (1, TRUE);
INSERT INTO t1 VALUES (2, FALSE);
INSERT INTO t1 VALUES (3, NULL);
COMMIT;
-- 1-2
SELECT column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name = 'T1';
COLUMN_NAME DATA_TYPE DATA_LENGTH
----------- --------- -----------
C1 NUMBER 22
C2 BOOLEAN 1
2 행이 선택되었습니다.
아래는 t1 테이블을 조회한 결과입니다. DUMP 함수의 결과를 보면 BOOLEAN 타입의 코드가 252이고, TRUE는 1, FALSE는 0으로 저장되는 것을 알 수 있습니다. 참고 SQL*Plus 19.0 버전은 BOOLEAN 값을 TRUE는 1, FALSE는 0으로 표시합니다.
-- 2-1: SQL*Plus 23.0
SELECT c1, c2, DUMP (c1) AS c1_d, DUMP (c2) AS c2_d FROM t1;
C1 C2 C1_D C2_D
-- ----- ------------------ ----------------
1 TRUE Typ=2 Len=2: 193,2 Typ=252 Len=1: 1
2 FALSE Typ=2 Len=2: 193,3 Typ=252 Len=1: 0
3 Typ=2 Len=2: 193,4 NULL
3 행이 선택되었습니다.
-- 2-2: SQL*Plus 19.0
SELECT * FROM t1;
C1 C2
-- --
1 1
2 0
3
3 행이 선택되었습니다.
BOOLEAN 값은 값, 비교 조건, IS [NOT] { TRUE | FALSE } 조건 등으로 평가할 수 있습니다. IS NOT 조건은 널을 포함한다는 점에 주의해야 합니다.
-- 3-1
SELECT * FROM t1 WHERE c2;
C1 C2
-- ----
1 TRUE
1개의 행이 선택되었습니다.
-- 3-2
SELECT * FROM t1 WHERE c2 = TRUE;
C1 C2
-- ----
1 TRUE
1개의 행이 선택되었습니다.
-- 3-3
SELECT * FROM t1 WHERE c2 != TRUE;
C1 C2
-- -----
2 FALSE
1개의 행이 선택되었습니다.
-- 3-4
SELECT * FROM t1 WHERE c2 IS TRUE;
C1 C2
-- ----
1 TRUE
1개의 행이 선택되었습니다.
-- 3-5
SELECT * FROM t1 WHERE c2 IS NOT TRUE;
C1 C2
-- -----
2 FALSE
3
2 행이 선택되었습니다.
아래 쿼리는 BOOLEAN 값을 FALSE로 조회합니다.
-- 4-1
SELECT * FROM t1 WHERE NOT c2;
C1 C2
-- -----
2 FALSE
1개의 행이 선택되었습니다.
-- 4-2
SELECT * FROM t1 WHERE c2 = FALSE;
C1 C2
-- -----
2 FALSE
1개의 행이 선택되었습니다.
-- 4-3
SELECT * FROM t1 WHERE c2 != FALSE;
C1 C2
-- ----
1 TRUE
1개의 행이 선택되었습니다.
-- 4-4
SELECT * FROM t1 WHERE c2 IS FALSE;
C1 C2
-- -----
2 FALSE
1개의 행이 선택되었습니다.
-- 4-5
SELECT * FROM t1 WHERE c2 IS NOT FALSE;
C1 C2
-- ---
1 TRUE
3
2 행이 선택되었습니다.
아래 쿼리는 BOOLEAN 값에 TO_CHAR 함수와 TO_NUMBER 함수를 사용합니다.
-- 5
SELECT c1
, c2
, TO_CHAR (c2) AS c2_n
, TO_NUMBER (c2) AS c2_n
FROM t1;
C1 C2 C2_N C2_N
-- ----- ----- ----
1 TRUE TRUE 1
2 FALSE FALSE 0
3
3 행이 선택되었습니다.
SQL 문의 BOOLEAN 타입과 PL/SQL 코드의 BOOLEAN 타입이 호환되므로 비효율적인 변환이 불필요합니다.
-- 6-1
CREATE OR REPLACE FUNCTION f1 (i_v1 IN BOOLEAN)
RETURN VARCHAR2
IS
BEGIN
RETURN CASE WHEN i_v1 IS NULL THEN 'N' WHEN i_v1 THEN 'T' ELSE 'F' END;
END;
/
-- 6-2
SELECT c1, f1 (c2) AS f1 FROM t1;
C1 F1
-- --
1 T
2 F
3 N
3 행이 선택되었습니다.
[2023-06-06]
TO_BOOLEAN 함수로 숫자 값과 문자 값을 BOOLEAN 값으로 변환할 수 있습니다. 숫자 값은 0은 FLASE, 0이 아닌 값은 TRUE입니다. 문자 값은 아래 값만 허용하는 것 같으며 다른 값을 입력하면 "ORA-61800: 부적합한 부울 리터럴" 에러가 발생합니다.
-- 7
SELECT TO_BOOLEAN (2) AS c1
, TO_BOOLEAN (0) AS c2
, TO_BOOLEAN ('true') AS c3
, TO_BOOLEAN ('false') AS c4
, TO_BOOLEAN ('yes') AS c5
, TO_BOOLEAN ('no') AS c6
, TO_BOOLEAN ('on') AS c7
, TO_BOOLEAN ('off') AS c8
, TO_BOOLEAN ('1') AS c9
, TO_BOOLEAN ('0') AS c10
FROM DUAL;
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
---- ----- ---- ----- ---- ----- ---- ----- ---- -----
TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE
1개의 행이 선택되었습니다.
BOOLEAN_AND_AGG, BOOLEAN_OR_AGG 함수로 BOOLEAN 값을 집계할 수 있습니다. 두 함수는 분석 함수로 사용할 수 있습니다.
-- 8
SELECT BOOLEAN_AND_AGG (c2) AS baa
, BOOLEAN_OR_AGG (c2) AS boa
FROM t1;
BAA BOA
----- ----
FALSE TRUE
1개의 행이 선택되었습니다.