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 = any(array[1, 2, 3])이라고 되어 있습니다. operator가 =이지요. array expression은 array[1, 2, 3]으로 쓸 수 있어요. 볼까요? 1 = 1이거나, 1 = 2이거나, 1= 3인 경우 참입니다. 1 = 1인가요? 따라서, 이 경우 true입니다.
참 값이 나옵니다.
반면 이것은 어떤가요? 연산자가 = 입니다. 4 = 1인가요? 4 = 2인가요? 4 = 3인가요? 셋 다 아닙니다. 따라서, 이 경우는 false가 뜨게 됩니다.
당연하게도 거짓이 나왔음을 볼 수 있습니다.
all 연산자
all 은 any, some과 다르게 array에 있는 모든 원소가 조건을 만족 시켜야 참이 됩니다.
3번 쿼리를 보겠습니다. 연산자는 =입니다. 그리고 왼쪽의 expr은 1이고요. 오른쪽 배열에는 1, 2, 3이 있습니다. 이 경우, 1 = 1, 1 = 2, 1 = 3을 모두 만족해야 참이 나옵니다. 이 세 조건 중에 1 = 1이라는 조건만 만족합니다.
나머지 두 조건은 만족하지 않습니다.
결과는 거짓이 나왔네요.
그러면 4번 쿼리는 어떨까요? 연산자가 <= 입니다. 왼쪽의 expression이 1이고, 오른쪽 array에는 1, 2, 3이 있어요. 그러면 조건이 3개 걸립니다. 1 <= 3이고, 2 <= 3이고, 3 <= 3이면 4번 쿼리가 참이 나올 겁니다.
세 조건 다 만족합니다.
따라서 결과는 참이 나옵니다. 이제 문제. 1 = any(array[null, 2, 3])의 결과는 어떻게 나올까요? 곰곰히 생각해 보시고 모르시겠다면 아래 글을 참고하시면 되겠습니다.
- sql null 값과 널 체크 하는 방법에 대해 알아봅시다. 링크
실전
이것을 어떻게 써 먹을 수 있는가? some이나 any가 in 절과 유사하다는 점을 이용해 봅시다. 연산자에 like를 넣고, array에 패턴을 넣으면 어떨까요? 특정한 컬럼이 패턴 여러 개 중 하나를 만족하는지, 혹은 다 만족하는지 등을 구할 수 있습니다.
즉, like in을 구현할 수 있습니다.
5번 쿼리를 봅시다. where 절에 title이 왼쪽에 있어요. 연산자가 like네요. any로 걸려 있지요? 배열 안에는 ‘%c%’와 ‘%m%’이 있어요. 이 경우
- title like ‘%c%’ 이거나
- title like ‘%m%’인 것
을 뽑게 됩니다. ‘com’과 ‘math’는 ‘c’나 ‘m’을 부분 문자열로 가지므로, 2개가 출력됩니다.
나머지 하나는 title이 ‘pu’인 것인데요. ‘c’와 ‘m’ 둘 다 부분 문자열로 가지지 않습니다.
6번 쿼리를 봅시다. title이 왼쪽에 있네요. 연산자는 like고요. all로 걸려 있지요? 배열 안에는 ‘%c%’와, ‘%m%’이 있습니다. 이 경우
- title like ‘%c%’
- title like ‘%m%’
이 두 조건을 만족해야 해요. ‘c’와 ‘m’ 둘 다 부분 문자열로 가지는 것을 출력하는데요. ‘com’만이 가집니다. 따라서, 결과는 하나만 출력됩니다.