[PostgreSQL, Greenplum] 산술연산자, 비교연산자, 논리연산자, 기타연산자 (Operators)
Greenplum and PostgreSQL Database 2020. 6. 28. 20:27이번 포스팅에서는 PostgreSQL, Greenplum DB의 4가지 연산자(Operators)에 대해서 알아보겠습니다.
- 산술 연산자 (Arithmetic Operators)
- 비교 연산자 (Comparison Operators)
- 논리 연산자 (Logical Operators)
- 비트 연산자 (Bitwise Operators)
(1) 산술 연산자 (Arithmetic Operators) |
* Reference: https://www.postgresql.org/docs/9.4/functions-math.html
산술연산자는 어려운 것은 없으므로 추가 설명은 생략하겠으며, 다만 나눗셈(/)에 대해서만 조심해야하는 부분이 있어서 추가 설명을 하겠습니다.
나눗셈의 분자와 분모가 모두 정수(int)인 경우 나눗셈(/)을 하면 정수의 몫을 반환하며, 소수점 부분은 무시가 되므로 유의할 필요가 있습니다. 만약 소수점자리까지의 나눗셈 계산 결과가 모두 필요한 경우 분자나 혹은 분모를 NUMERIC 혹은 FLOAT 로 데이터 형태 변환을 해주어야 합니다. 아래에 간단한 예를 들어보겠습니다. (이걸 신경을 안쓰면 나중에 소수점 부분의 결과가 무시된걸 모르고서 원하는 값이 아니라면서 당황하는 수가 생깁니다.)
DROP TABLE IF EXISTS test; CREATE TABLE test ( a int , b int ); INSERT INTO test VALUES (2, 4), (3, 5), (4, 7); SELECT * FROM test; ------------- a b ------------- 2 4 3 5 4 7
-- 나눗셈 결과의 소수점 자리 무시 SELECT b / a AS div FROM test; ---------- div ---------- 2 1 1 -- 분자를 Numeric으로 형 변환하면 나눗셈 결과 소수점 자리 나옴 SELECT b::numeric / a AS div_1 FROM test; ---------- div_1 ---------- 2.0000000000000000 1.6666666666666667 1.7500000000000000 -- 분모를 Numeric으로 형 변환하면 나눗셈 결과 소수점 자리 나옴 SELECT b / a::numeric AS div_2 FROM test; ---------- div_2 ---------- 2.0000000000000000 1.6666666666666667 1.7500000000000000 |
계승(factorial)의 경우 SELECT 5!, SELECT !!5 처럼 '!'가 한개냐, 두개냐에 따라서 정수를 써주는 위치가 달라집니다.
절대값(Absolute value)를 구할 때는 '@ col_nm' 혹은 '@ 숫자' 를 해주면 되는데요, 이때 '@' 다음에 스페이브 1칸을 띄워주어야 합니다. (만약 '@' 다음에 한 칸 띄우지 않으면 SQL Error [42883]: ERROR: operator does not exist: @- numeric 와 같은 ERROR가 발생합니다.)
산술 연산을 한 후에 'AS col_nm' 처럼 alias 별명 칼럼 이름을 부여할 수 있습니다.
(2) 비교 연산자 (Comparison Operators) |
* Reference: https://www.postgresql.org/docs/9.4/functions-comparison.html
비교 연산자(comparison operators)도 어려운 것은 없으므로 길게 설명할 필요는 없어보입니다. 아래의 간단한 예를 살펴보시기 바랍니다.
비교 연산자는 WHERE 조건절에서 사용되어 두 값을 비교하게 되며, 비교 연산자의 조건을 만족하면 참(TRUE)을, 비교 연산자의 조건을 만족하지 않으면 거짓(FALSE)을 반환합니다. 이를 이용해서 비교 연산자에 대해 참(TRUE)인 조건을 만족하는 값만을 선택(SELECT)해 올 수 있습니다.
----------------------- -- Comparison Operators ----------------------- DROP TABLE IF EXISTS comparison; CREATE TABLE comparison ( a int , b int ); INSERT INTO comparison VALUES (1, 1), (1, 2), (2, 1), (2, 2); SELECT * FROM comparison; ---------- a b ---------- 1 1 1 2 2 1 2 2 -- equal to SELECT * FROM comparison WHERE a = b; ---------- a b ---------- 1 1 2 2 -- not equal SELECT * FROM comparison WHERE a != b; SELECT * FROM comparison WHERE a <> b; ---------- a b ---------- 1 2 2 1 -- greater than SELECT * FROM comparison WHERE a > b; ---------- a b ---------- 2 1 -- less than SELECT * FROM comparison WHERE a < b; ---------- a b ---------- 1 2 -- greater than or equal to SELECT * FROM comparison WHERE a >= b; ---------- a b ---------- 1 1 2 1 2 2 -- less than or equal to SELECT * FROM comparison WHERE a <= b; ---------- a b ---------- 1 1 1 2 2 2 |
다만 한가지 조심한 것이 있습니다. 비교 연산자 두개를 이어붙여서 사용하는 경우 순서(sequence)가 틀리면 ERROR가 발생합니다. 따라서 꼭 순서에 맞게 (가령, >= greater than or equal to) 비교 연산자를 써주어야 합니다.
-- SQL Error [42883]: ERROR: operator does not exist: integer =! integer SELECT * FROM comparison WHERE a =! b; -- SQL Error [42883]: ERROR: operator does not exist: integer >< integer SELECT * FROM comparison WHERE a >< b; -- SQL Error [42601]: ERROR: syntax error at or near "=>" SELECT * FROM comparison WHERE a => b; -- SQL Error [42883]: ERROR: operator does not exist: integer =< integer SELECT * FROM comparison WHERE a =< b; |
(3) 논리 연산자 (Logical Operators) |
논리 연산자(Logical Operators)는 조건절에서 여러개의 조건을 AND, OR, NOT 으로 조합하여 사용할 수 있도록 해줍니다. 아래에 우측에 집합 벤다이어그램으로 그림을 그려놓았으니 참고하시기 바랍니다.
아래의 표는 WHERE 조건절에 a와 b의 두 조건이 참(TRUE), 거짓(FALSE) 여부의 조합별로 AND, OR, NOT 논리 연산자의 결과값이 참(TRUE)인지 또는 거짓(FALSE)인지를 정리한 표입니다. NULL 은 FALSE 로 간주된다는 점 유의하시기 바랍니다.
[ PostgreSQL Logical Operators Table by TRUE, FALSE combinations ]
* Reference: https://www.postgresql.org/docs/9.4/functions-logical.html
위의 (2)번에서 만들었던 comparison 테이블에 NULL 값을 포함한 행 두개를 추가해서 간단한 논리 연산자 예제를 만들어보겠습니다.
--------------------- -- Logical Operators --------------------- INSERT INTO comparison VALUES (NULL, 5), (NULL, NULL); SELECT * FROM comparison; ---------- a b ---------- 1 1 1 2 2 1 2 2 [NULL] 5 [NULL] [NULL] -- AND SELECT * FROM comparison WHERE a = 1 AND b = 2; ---------- a b ---------- 1 2 -- OR SELECT * FROM comparison WHERE a = 1 OR b = 5; ---------- a b ---------- 1 1 1 2 [NULL] 5 -- NOT SELECT * FROM comparison WHERE NOT (a = 1); 2 1 2 2 -- NOT IN SELECT * FROM comparison WHERE a NOT IN (1); ---------- a b ---------- 2 1 2 2 -- IS NOT NULL SELECT * FROM comparison WHERE b IS NOT NULL; ---------- a b ---------- 1 1 1 2 2 1 2 2 [NULL] 5 -- IS NOT NULL AND IS NOT NULL SELECT * FROM comparison WHERE a IS NOT NULL AND b IS NOT NULL; ---------- a b ---------- 1 1 1 2 2 1 2 2 -- NOT BETWEEN SELECT * FROM comparison WHERE b BETWEEN 1 AND 2; ---------- a b ---------- 1 1 1 2 2 1 2 2 SELECT * FROM comparison WHERE b NOT BETWEEN 1 AND 2; ---------- a b ---------- [NULL] 5 |
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)