본문 바로가기
DBMS/PostgreSQL

[PostgreSQL] ANY 연산자

by 드바 2024. 1. 1.

 

ANY 연산자

PostgreSQL에서 ANY 연산자는 조건에 들어오는 값 중 하나라도 조건을 충족하는지 확인하는 데 사용됩니다. 
이미 익숙한 IN 연산자와 유사하게 사용됩니다.

차이점은 
ANY는 = 비교외에 부등호(>=, <=, =, >, <)와 사용이 가능하고
IN 연산자는 불가능
 

사용법

숫자형 컬럼

-- 숫자형 컬럼에 사용
test=# SELECT * FROM test11 ;
 id | number 
----+--------
  1 |      1
  2 |      2
  3 |      3
  4 |      4
  5 |      5
(5 rows)

-- 조건에 해당하는 값 모두 출력(in 연산자와 동일)
test=# SELECT * FROM test11 WHERE number = ANY(ARRAY[1, 3, 5]);
 id | number 
----+--------
  1 |      1
  3 |      3
  5 |      5
(3 rows)

 

부등호 비교

in과 다르게 any는 부등호 비교에서도 사용 가능 합니다

-- 비교조건 중 가장 낮은 값보다 큰 데이터 조회
test=# SELECT * FROM test11 WHERE number >= ANY(ARRAY[1, 3]);
 id | number 
----+--------
  1 |      1
  2 |      2
  3 |      3
  4 |      4
  5 |      5
(5 rows)

-- 비교조건 중 가장 큰 값보다 작은 데이터 조회
test=# SELECT * FROM test11 WHERE number <= ANY(ARRAY[1, 3]);
 id | number 
----+--------
  1 |      1
  2 |      2
  3 |      3
(3 rows)

 

문자형 컬럼에 사용

-- 문자형 컬럼에 사용
test=# SELECT * FROM products ;
 id |     name     |  category   
----+--------------+-------------
  1 | Laptop       | Electronics
  2 | T-shirt      | Clothing
  3 | Mobile Phone | Electronics
  4 | Jeans        | Clothing
(4 rows)


test=# SELECT * FROM products WHERE category = ANY(ARRAY['Electronics', 'Clothing']);
 id |     name     |  category   
----+--------------+-------------
  1 | Laptop       | Electronics
  2 | T-shirt      | Clothing
  3 | Mobile Phone | Electronics
  4 | Jeans        | Clothing
(4 rows)

 

서브쿼리 형태로 사용

서브쿼리의 값을 이용한 비교도 가능합니다

-- 서브쿼리 형태로 사용
test=# SELECT * FROM employees ;
 id |      name       | department_id 
----+-----------------+---------------
  1 | John Doe        |             1
  2 | Jane Smith      |             1
  3 | Michael Johnson |             2
  4 | Emily Davis     |             3
(4 rows)

test=# select * from departments ;
 id | name  
----+-------
  1 | Sales
  2 | IT
  3 | HR
(3 rows)

test=# SELECT * FROM employees WHERE department_id = ANY(SELECT id FROM departments WHERE name = 'Sales');
 id |    name    | department_id 
----+------------+---------------
  1 | John Doe   |             1
  2 | Jane Smith |             1
(2 rows)

 

반응형

실행계획비교

in과 any의 실행계획 비교 입니다
동일한 계획을 보여줍니다.

ANY

test=# explain (analyze, buffers) 
test-# SELECT * FROM test11 a WHERE number = ANY(ARRAY[1, 3, 5]);
                                            QUERY PLAN                                            
--------------------------------------------------------------------------------------------------
 Seq Scan on test11 a  (cost=0.00..1.07 rows=3 width=8) (actual time=0.004..0.005 rows=3 loops=1)
   Filter: (number = ANY ('{1,3,5}'::integer[]))
   Rows Removed by Filter: 2
   Buffers: shared hit=1
 Planning:
   Buffers: shared hit=22
 Planning Time: 0.106 ms
 Execution Time: 0.014 ms
(8 rows)

 

IN

test=# explain (analyze, buffers) 
test-# SELECT * FROM test11 a WHERE number in (1, 3, 5);
                                            QUERY PLAN                                            
--------------------------------------------------------------------------------------------------
 Seq Scan on test11 a  (cost=0.00..1.07 rows=3 width=8) (actual time=0.004..0.006 rows=3 loops=1)
   Filter: (number = ANY ('{1,3,5}'::integer[]))
   Rows Removed by Filter: 2
   Buffers: shared hit=1
 Planning:
   Buffers: shared hit=4
 Planning Time: 0.068 ms
 Execution Time: 0.014 ms
(8 rows)

 
 
 

댓글