7.1.3. Estruturas Condicionais

Em PL/pgSQL temos dois tipos de comandos condicionais: if-then-else e case-when.

A sintaxe de comandos if-then-else é a seguinte:

IF condição THEN
    comandos;
[ELSIF condição THEN
    comandos;]
[ELSE
    comandos;]
END IF;

Comandos case-when possuem a seguinte sintaxe:

CASE search-expression
    WHEN expressão [, expressão [ ... ]] THEN
      comandos
   [WHEN expressão [, expressão [ ... ]] THEN
      comandos]
   [ELSE
      comandos]
END CASE;

No exemplo da função my_distance, se considerarmos que a distância entre os pontos só pode ser computada caso eles se encontrem no mesmo sistema de referência espacial, poderíamos reescrever a função da seguinte forma:

CREATE OR REPLACE FUNCTION my_distance(first GEOMETRY, second GEOMETRY)
    RETURNS NUMERIC
    AS
    $$
        DECLARE
            dx NUMERIC DEFAULT 0.0;
            dy NUMERIC DEFAULT 0.0;
            d  NUMERIC DEFAULT 0.0;
        BEGIN
            IF(ST_SRID(first) <> ST_SRID(second)) THEN
                return NULL;
            END IF;

            dx := ST_X(first) - ST_X(second);
            dy := ST_Y(first) - ST_Y(second);

            d := sqrt(power(dx, 2) + power(dy, 2));

            RETURN d;
        END;
    $$
    LANGUAGE plpgsql;

Repare que agora, se chamarmos a função para um par de pontos em diferentes sistemas de coordenadas, receberemos um valor nulo (NULL) como retorno:

SELECT my_distance(
           ST_GeometryFromText('POINT(0 0)', 4326),
           ST_GeometryFromText('POINT(1 1)', 29193));

No entanto, ao invés de retornarmos um valor NULL o mais adequado seria interromper a execução da função indicando algum tipo ou condição de erro. A seção a seguir mostra como podemos proceder nestes casos.