2012-03-22 4 views
0

을 내가포스트 그레스 배열 비교 혼란

select array[19,21,500] <= array[23,5,0]; 

를 실행 나는 사실 얻는다. 내가

select array[24,21,500] <= array[23,5,0]; 

을 실행할 때

는하지만 거짓 얻을. 이것은 비교가 첫 번째 요소에만 있음을 나타냅니다.

왼쪽 배열의 모든 항목이 오른쪽 배열 (동일한 인덱스)에있는 항목보다 적 으면 true를 반환하고, 그렇지 않으면 true를 반환하도록 모든 항목을 비교하는 연산자 또는 함수가 있는지 궁금합니다. false를 반환합니다.

전체 배열이 "미만"또는 "지정된 배열보다 큰"행을 모두 검색하고자합니다. 이것이 가능한지 나는 모른다.

+1

첫 번째 요소는 아니며 문자열 비교의 연속 문자와 다른 첫 번째 요소입니다. doc에 따르면 : http://www.postgresql.org/docs/9.1/static/functions-array.html 당신이 원하는 것을 수행하는 기본 제공 연산자는 없지만, 아무것도 작성하는 것을 방해하지는 않습니다. 최소한 프로 시저 코드 (plpgsql)에서는 할 수없는 것처럼 보이지 않습니다. 두 배열 사이의 요소 나 차원 수가 다른 경우를 포괄하기 위해 의미를 조금 더 자세히 설명해야합니다. –

+0

감사합니다. 몇 가지 기하학적 데이터 유형을 살펴보고 거기에 뭔가를 얻을 수 없는지 확인해 보겠습니다. – user1286546

답변

0

배열은 순서 속성을 기본 속성으로 사용합니다. 즉, '{1,3,2}' <> '{1,2,3}'이며 이는 비교를 볼 때 이해하는 것이 중요합니다. 이것들은 연속적인 요소들을 살펴 본다.

잠시 PostgreSQL에 inet 유형이 없다고 상상해보십시오. int []를 사용하여 cidr 블록을 지정할 수 있습니다. 예를 들어,이 값은 10.039.16을 나타내는 '{10,0,0,1,8}'으로 볼 수 있습니다. 우리는이 방법으로 IP 주소를 비교할 수 있습니다. 또한 다음과 같이 bigint로 나타낼 수도 있습니다. '{167772161,8}' 비교의 경우, 서로 다른 서브넷을 가진 두 개의 IP 주소가있는 경우이를 비교할 수 있고보다 구체적인 서브넷을 가진 서브넷은 덜 구체적인 서브넷이있는 IP 주소 뒤에옵니다.

데이터베이스 정규화의 기본 원칙 중 하나는 각 필드가 해당 도메인에 대해 하나의 값만 포함해야한다는 것입니다. 배열이 반드시이 원칙을 위반하지 않는 한 가지 이유는 정규성 (튜플 세트 또는 ) 대신 오히려 특이 값을 나타내는 데 사용할 수 있기 때문입니다. 이 경우 비교가 완벽합니다.

당신이 순서를 존중하지 않는 연산자를 만들고 싶다면, 자신을 만들자. 기본적으로 두 가지를 기반으로 bool을 반환하는 함수를 만든 다음이 값을 연산자로 묶습니다. 자세한 방법은 docs의 CREATE OPERATOR을 참조하십시오. PostgreSQL이 기본적으로 제공하는 것들로 결코 제한되지 않습니다.

1

실제로, 당신이 요청 작업을 수행 bool_and()와 병렬 및 집계에 unnest()를 사용하려면

SELECT bool_and(a < b) -- each element < corresponding element in 2nd array 
     ,bool_and(a <= b) 
     ,bool_and(a >= b) 
     ,bool_and(a > b) 
     -- etc. 
FROM (SELECT unnest('{1,2,3}'::int[]) AS a, unnest('{2,3,4}'::int[]) AS b) t 

두 배열은 병렬로 벗어난다 할 기본 요소의 같은 수 있어야합니다. 그렇지 않으면 CROSS JOIN이됩니다. 즉 완전히 다른 결과입니다.