[PostgreSQL] 배열(array) 연산자 (ft. compare, concat)
PostgreSQL에서 배열을 다룰때 사용하는 연산자에 대해 알아보자.
특히 배열과 배열의 비교 또는 배열에 추가적인 값을 넣어줄때 많이 사용하게 될 것이다.
PostgreSQL Document에 자세한 설명이 나와있으니 표를 가져와 정리해 두고자 한다.
▷ PostgreSQL Document Array Operators
표현식 | 설명 | 예시 | 결과 |
= | equal | ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] | t |
<> | not equal | ARRAY[1,2,3] <> ARRAY[1,2,4] | t |
< | less than | ARRAY[1,2,3] < ARRAY[1,2,4] | t |
> | greater than | ARRAY[1,4,3] > ARRAY[1,2,4] | t |
<= | less than or equal | ARRAY[1,2,3] <= ARRAY[1,2,3] | t |
>= | greater than or equal | ARRAY[1,4,3] >= ARRAY[1,4,3] | t |
@> | contains | ARRAY[1,4,3] @> ARRAY[3,1,3] | t |
<@ | is contained by | ARRAY[2,2,7] <@ ARRAY[1,7,4,2,6] | t |
&& | overlap (have elements in common) | ARRAY[1,4,3] && ARRAY[2,1] | t |
|| | array-to-array concatenation | ARRAY[1,2,3] || ARRAY[4,5,6] | {1,2,3,4,5,6} |
|| | array-to-array concatenation | ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] | {{1,2,3},{4,5,6},{7,8,9}} |
|| | element-to-array concatenation | 3 || ARRAY[4,5,6] | {3,4,5,6} |
|| | array-to-element concatenation | ARRAY[4,5,6] || 7 | {4,5,6,7} |
표현식과 설명 예시만 봐서는 사실 잘 모르는 부분이 있을수 있다.
좀 더 자세히 설명을 해보자면,
평등 연산자 ( = , <>) 의 경우 배열의 원소 별 비교를 진행한다.
select
array[1,2,3] = array[1,2,4] as compare1, -- false
array[1,2,3] <> array[1,2,4] as compare2; -- true
순서 연산자( > , < , >= , <=)의 경우 같은 순서로 배열의 각 요소를 비교한다.
크기랑은 상관없이 배열의 서로 위치한 요소 쌍을 기반으로 비교를 진행하는 것이다.
select
array[1,2,5] >= array[1,2,4] as compare1, -- true
array[1,2,5] <= array[1,2,4,5] as compare2; -- false
포함 연산자(@> , <@)의 경우 각각의 고유한 요소가 다른 배열에도 존재하는 경우 배열은 다른 배열에 포함된다고 표시한다.
-- This reads as array['a', 'b', 'c'] contains array['a', 'b', 'b', 'a']
select array['a', 'b', 'c'] @> array['a', 'b', 'b', 'a'] as contains; -- true
-- this reads as array[1, 1, 4] is contained by array[4, 3, 2, 1]
select array[1, 1, 4] <@ array[4, 3, 2, 1] as is_contained_by; -- true
한 배열의 요소가 하나라도 다른 배열에 포함되어있으면 true를 반환하는것 같다.
중첩 연산자(&&)의 경우 서로 다른 배열에 공통 요소가 있는지를 확인해준다.
공통 요소가 있는 배열을 중첩 배열 이라고한다.
select
array[1, 2] && array[2, 3] as overlap1, -- true
array[1, 2] && array[3, 4] as overlap2; -- false
뭔가 포함 연산자 두개를 합친게 중첩연산자로 보인다.
결합 연산자(||)의 경우 말 그대로 두 배열을 합쳐주는건데 사실 그 외에도 좀 다양하게 쓰인다.
개인적으로는 두 배열이 아니라 두 요소를 합치는거라 배열에서도 사용이 가능한것이라 생각된다.
select
array[1, 2, 3] || array[4, 5, 6] as concat1, -- {1,2,3,4,5,6}
array[1, 2, 3] || array[[4,5,6],[7,8,9]] as concat2, -- {{1,2,3},{4,5,6},{7,8,9}}
3 || array[4, 5, 6] as concat3, -- {3,4,5,6}
array[1, 2, 3] || 7 as concat4, -- {1,2,3,7}
참고 : https://www.postgresql.org/docs/10/functions-array.html
참고 : https://popsql.com/learn-sql/postgresql/how-to-compare-arrays-in-postgresql