쿼리를 이용하다 보면, 어떤 값과 배열을 비교하여 하나라도 존재하면, true를 반환해줘야 하는 일이 생긴다.
그럴 때 보통 자주 사용하는 게, IN 연산자이다. 그런데 Postgresql에서는 IN과 비슷한 기능을 하는
ANY 연산자를 지원한다. 오늘은 ANY연산자와 IN 연산자를 알아보도록 하자~
주로 사용하는 상황은 다음과 같다.
B나는 배열에서 A라는 컬럼과 같은 값을 지닌 값이 존재 할 경우 true를 반환,
A라는 컬럼값이 서브쿼리로 반환 되는 B라는 값에 존재 할 경우 true를 반환 등등 배열이나 값이 여러개 일 때
비교하기 위해 사용한다. 그럼 바로 ANY와 IN에 대해 알아보자.
우선 기본적인 문법은 다음과 같다.
SELECT [컬럼] FROM 테이블 [WHERE] 컬럼 =ANY(배열);
SELECT [컬럼] FROM 테이블 [WHERE] 컬럼 IN (연속 된 문자열);
이걸 가지고 바로 연습을 해보자.
1. ANY 연산자
============================================================================
ANY는 여러 행을 반환해주는 서브쿼리와 비교할 때 유용하게 쓰인가.
SELECT 컬럼A FROM [테이블A] WHERE 컬럼A = ANY(SELECT 컬럼B FROM 테이블B WHERE [조건문]);
샘플 예제를 보면 다음과 같다.
COMTNWEBLOG라는 로그테이블에 사용자ID가 USER1.5인 사용자의 로그를 추출하니 이미지와 같이
5개가 나왔다. 이제 이 여러개의 행과 비교를 하려면 ANY연산자를 다음과 같이 사용한다.
'WEBLOG_0000004038554' 라는 값이 서브쿼리를 통해 반환 된 행 중에 있는지 확인 해보니, 존재 하였다. 결과는
true를 반환하였다. 만약 값이 없다면?
이렇게 false를 반환하였다.
그럼 이제 IN 함수를 보도록 하자.
2. IN 연산자
============================================================================
IN 연산자 또한 ANY 함수와 똑같이 작동한다. 문법은 다음과 같다.
SELECT 컬럼A FROM [테이블A] WHERE 컬럼A IN (SELECT 컬럼B FROM 테이블B WHERE [조건문]);
ANY 연산자와 비교해보면 IN만 바뀌었지 나머지는 똑같다는 걸 알 수 있다. 그럼 바로 예제 샘플도 보자.
아까와 똑같은 쿼리문을 서브쿼리로 활용하여 테스트 해보자.
아까와 똑같은 결과가 나왔다. 값이 WEBLOG_0000004038554라는 값이 서브쿼리에서 반환 해주는 행 중에 있으니,
true를 반환해주었다. 없었다면 false를 반환해 줬을 것이다..
여기서 궁금증이 생겼다. 그럼 ANY랑 IN은 뭐가 다른가?? 분명히 예전에 개발을 할 때 IN으로는 원하는 결과를 얻을 수 없었어서 ANY를 썼었다. 이제 ANY와 IN의 차이점을 알아보자.
3. ANY와 IN의 공통점과 차이점
============================================================================
ANY와 IN의 공통점은 하위쿼리를 사용할 때는 정확히 같게 동작한다.
SELECT * FROM table
WHERE column IN(subquery);
SELECT * FROM table
WHERE column = ANY(subquery);
이 문법은 위에서 본 것과 동일하다. 결국 둘 다 똑같이 작동한다는 걸 알 수 있다.
그럼 차이점은 무엇일까?
ANY 연산자는 비교 연산자 (>=, <=, = , >, <) 가 사용 가능 하다는 것이다.
1. " = "
SELECT * FROM TableA WHERE col =ANY('오렌지', '바나나', '망고');
"=" 연산자는 비교값과 동일한 것은 모두 출력한다.
-> col = '오렌지' OR col = '바나나' OR col= '망고' 와 동일하다.
2. " > "
SELECT * FROM TableA WHERE col >ANY(37, 51, 83);
">" 연산자는 37보다 큰 값은 모두 출력한다.
-> col > 37 OR col > 51 OR col > 83 과 동일하다. 즉 37이상만 되면 모두 true이기 때문에 37이상은 전부 가져온다.
3. " < "
SELECT * FROM TableA WHERE col <ANY(37, 51, 83);
">" 연산자는 83보다 작은 값은 모두 출력한다.
-> col < 37 OR col < 51 OR col < 83 과 동일하다. 즉 83보다 작으면 모두 true이기 때문에 83미만은 전부 가져온다.
이하 ">="와 "<=" 는 설명을 생략하겠다.
마지막으로 ANY연산자로는 연속 된 문자열을 비교 할 수 없고, 오직 IN 연산자만 가능하다.
IN 연산자는 연속 된 문자열 비교 가능
SELECT * FROM table WHERE column IN('오렌지' , '바나나' , '사과'); => O
ANY 연산자는 연속 된 문자열 비교 하지 못함
SELECT * FROM table WHERE column =ANY('오렌지' , '바나나' , '사과'); => X
그러니 이런 경우에는 IN 연산자를 쓰도록 하자.
============================================================================
생각보다 글이 많이 길어졌다.. 근데 그때 왜 IN을 안쓰고 ANY를 썼었는지가 기억이 나지 않는다.. 다음부터는
바로바로 기록해야겠다..
'데이터베이스 > 쿼리' 카테고리의 다른 글
[Postgres] 테이블 정보 조회 ( 데이터베이스 목록, 테이블 목록, 스키마 목록, 컬럼 목록, 테이블 코멘트, 컬럼 코멘트 조회 ) (0) | 2022.02.08 |
---|---|
[Postgres] cmd창에서 psql을 통해 SQL문을 사용해보자. (0) | 2022.02.08 |
[Postgres] 기본적인 배열함수를 알아보자 ( feat. array_agg, array_to_string, string_to_array, unnest) (0) | 2022.02.03 |
[Postgres] 중복값을 체크해보자. ( feat. GROUP BY, HAVING ) (0) | 2022.01.28 |
[Postgres] Procedure(프로시저), Function(함수) 정리 (0) | 2022.01.18 |