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)
'DBMS > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 데이터 이관 시 ERROR: permission denied for schema (1) | 2024.01.29 |
---|---|
[PostgreSQL] 열을 행으로 변환하기 (2) | 2024.01.04 |
[PostgreSQL] 자동 증가(Auto Increment) 컬럼 사용법 (1) | 2023.12.15 |
[PostgreSQL] unlogged/logged table 성능비교 (0) | 2023.12.14 |
[PostgreSQL] 테이블 데이터 text 파일로 저장하기(COPY 명령) (0) | 2023.12.12 |
댓글