개발공작소
article thumbnail
728x90
반응형

쿼리를 이용하다 보면, 어떤 값과 배열을 비교하여 하나라도 존재하면, 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연산자를 다음과 같이 사용한다.

::text는 안써도 됨!

'WEBLOG_0000004038554' 라는 값이 서브쿼리를 통해 반환 된 행 중에 있는지 확인 해보니, 존재 하였다. 결과는 

true를 반환하였다. 만약 값이 없다면? 

이렇게 false를 반환하였다.  

그럼 이제 IN 함수를 보도록 하자.

 

2. IN 연산자

============================================================================

IN 연산자 또한 ANY 함수와 똑같이 작동한다. 문법은 다음과 같다.

 

SELECT 컬럼A FROM [테이블A] WHERE 컬럼A IN (SELECT 컬럼B FROM 테이블B WHERE [조건문]);

ANY 연산자와 비교해보면 IN만 바뀌었지 나머지는 똑같다는 걸 알 수 있다. 그럼 바로 예제 샘플도 보자.

서브쿼리로 활용 할 쿼리문

아까와 똑같은 쿼리문을 서브쿼리로 활용하여 테스트 해보자. 

 

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를 썼었는지가 기억이 나지 않는다.. 다음부터는

바로바로 기록해야겠다..

728x90
반응형
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!