Home » SQL » POSTGRES » postgresql any some all 연산자에 대해 알아봅시다.

postgresql any some all 연산자에 대해 알아봅시다.

sql에서 any, some, all 등의 연산자를 지원하는 경우가 있어요. postgresql에서는 any, some, all 연산자를 제공합니다. 그리고 이를 배열과 함께 쓸 수 있습니다.

  • expression operator any(array expression)
  • expression operator some(array expression)
  • expression operator all(array expression)

any, some 연산자

먼저 any와 some은 배열 안에 있는 어떠한 것과 참이 되면 true가 됩니다.

[그림 1] 1번 쿼리

먼저, 1 = any(array[1, 2, 3])이라고 되어 있습니다. operator가 =이지요. array expression은 array[1, 2, 3]으로 쓸 수 있어요. 볼까요? 1 = 1이거나, 1 = 2이거나, 1= 3인 경우 참입니다. 1 = 1인가요? 따라서, 이 경우 true입니다.

[그림 2] 1번 쿼리의 결과

참 값이 나옵니다.

[그림 3] 2번 쿼리

반면 이것은 어떤가요? 연산자가 = 입니다. 4 = 1인가요? 4 = 2인가요? 4 = 3인가요? 셋 다 아닙니다. 따라서, 이 경우는 false가 뜨게 됩니다.

[그림 4] 2번 쿼리의 결과

당연하게도 거짓이 나왔음을 볼 수 있습니다.


all 연산자

all 은 any, some과 다르게 array에 있는 모든 원소가 조건을 만족 시켜야 참이 됩니다.

[그림 5] 3번 쿼리

3번 쿼리를 보겠습니다. 연산자는 =입니다. 그리고 왼쪽의 expr은 1이고요. 오른쪽 배열에는 1, 2, 3이 있습니다. 이 경우, 1 = 1, 1 = 2, 1 = 3을 모두 만족해야 참이 나옵니다. 이 세 조건 중에 1 = 1이라는 조건만 만족합니다.

나머지 두 조건은 만족하지 않습니다.

[그림 6] 3번 쿼리의 결과

결과는 거짓이 나왔네요.

[그림 7] 4번 쿼리

그러면 4번 쿼리는 어떨까요? 연산자가 <= 입니다. 왼쪽의 expression이 1이고, 오른쪽 array에는 1, 2, 3이 있어요. 그러면 조건이 3개 걸립니다. 1 <= 3이고, 2 <= 3이고, 3 <= 3이면 4번 쿼리가 참이 나올 겁니다.

세 조건 다 만족합니다.

[그림 8] 4번 쿼리의 결과

따라서 결과는 참이 나옵니다. 이제 문제. 1 = any(array[null, 2, 3])의 결과는 어떻게 나올까요? 곰곰히 생각해 보시고 모르시겠다면 아래 글을 참고하시면 되겠습니다.

  • sql null 값과 널 체크 하는 방법에 대해 알아봅시다. 링크

실전

이것을 어떻게 써 먹을 수 있는가? some이나 any가 in 절과 유사하다는 점을 이용해 봅시다. 연산자에 like를 넣고, array에 패턴을 넣으면 어떨까요? 특정한 컬럼이 패턴 여러 개 중 하나를 만족하는지, 혹은 다 만족하는지 등을 구할 수 있습니다.

즉, like in을 구현할 수 있습니다.

[그림 9] 5번 쿼리

5번 쿼리를 봅시다. where 절에 title이 왼쪽에 있어요. 연산자가 like네요. any로 걸려 있지요? 배열 안에는 ‘%c%’와 ‘%m%’이 있어요. 이 경우

  • title like ‘%c%’ 이거나
  • title like ‘%m%’인 것

을 뽑게 됩니다. ‘com’과 ‘math’는 ‘c’나 ‘m’을 부분 문자열로 가지므로, 2개가 출력됩니다.

나머지 하나는 title이 ‘pu’인 것인데요. ‘c’와 ‘m’ 둘 다 부분 문자열로 가지지 않습니다.

[그림 10] 6번 쿼리

6번 쿼리를 봅시다. title이 왼쪽에 있네요. 연산자는 like고요. all로 걸려 있지요? 배열 안에는 ‘%c%’와, ‘%m%’이 있습니다. 이 경우

  • title like ‘%c%’
  • title like ‘%m%’

이 두 조건을 만족해야 해요. ‘c’와 ‘m’ 둘 다 부분 문자열로 가지는 것을 출력하는데요. ‘com’만이 가집니다. 따라서, 결과는 하나만 출력됩니다.

Leave a Comment

13 + 11 =