9. 확장 SQL : 연산자

POSTGRES 는 왼쪽, 오른쪽 단일 연산자와 바이너리 연산자를 제공한다. 연산자는 서로 다른 숫자나 형의 매개인자에 과중 적재되거나 재사용될 수 있다. 연산자가 애매한 위치에 있다면 시스템은 올바른 연산자를 결정할 수 없으 며, 에러를 반환한다. 이러한 경우에, 어느 연산자를 사용할 것인지 이해를 돕 기 위해 왼쪽/오른쪽 피연산자를 형변환 할 수 있다.

두개의 complex 멤버를 더하는 연산자를 만드려면 아래와 같이 하면 된다. 먼저 새로운 형에 필요한 함수를 만들어야 한다. 그리고 나서, 해당 연산자를 이들 함 수와 함께 만들면 된다.

    CREATE FUNCTION complex_add(complex, complex) RETURNS complex AS '$PWD/obj/complex.so' LANGUAGE 'c';
    CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure = complex_add, commutator = + );

sfunc2 만 정의한다면, 각각의 인스턴스에서 속성값과는 독립적으로 수행되는 함수 로 지정할 수 있다. "Count" 는 이러한 aggregate 종류의 대표적인 경우이다. "Count" 는 0에서 시작되고, 각각의 인스턴스마다 합계에 1이 더해지며 인스턴스의 값은 무시된다. 여기서는 POSTGRES 내장 루틴인 int4inc 를 사용한다. 이 루틴은 해당 인자의 값을 하나 증가시킨다.

   CREATE AGGREGATE my_count (sfunc2 = int4inc, -- add one
                              basetype = int4, stype2 = int4,
                              initcond2 = '0'
                             );
   
   SELECT my_count(*) as emp_count from EMP;
 
 
   emp_count
   ---------
           4

"Average" 는 합계와 횟수, 둘다 계산하는 함수를 필요로 하는 aggregate 의 예이 다. 모든 인스턴스가 처리되고 나면, aggregate 에서 마지막 응답으로 합계를 횟 수로 나눈다. 이전에 사용했던 int4pl 과 int4inc 와 마찬가지로 int4div 는 POSTGRES 의 정수 나눗셈 루틴이며, 합계를 횟수로 나눈 결과를 계산한다.

   CREATE AGGREGATE my_average (sfunc1 = int4pl,  -- sum
                                basetype = int4,
                                stype1 = int4,
                                sfunc2 = int4inc, -- count
                                stype2 = int4,
 
          finalfunc = int4div, -- division
                                initcond1 = '0',
                                initcond1 = '0'
                               );
 
   SELECT my_average(salary) as emp_average FROM EMP;
 
 
   emp_average
   ------------
          1640