PostgreSQL 服务器编程 超越简单函数

1 背景知识

1.1 使用运算符完成数据比较

对于更多复杂的任务,你可以自定义自己的FRUIT_QTY 数据类型和操作符,并从一种类型转换到另外一种类型,比如可以完成苹果与橘子的总价比对。
如下例所示,可以定义 QTY 字段表示水果的数量,假设一个橘子等于1.5 个苹果价格,然后把苹果转换为橘子总价,可以用来比较苹果与橘子的总价谁高谁低。

1.2 创建一个水果类型

CREATE TYPE FRUIT_QTY as (name text,qty int);

1.3 确认水果类型能够使用

SELECT '("APPLE",3)'::FRUIT_QTY;

1.4 创建函数

CREATE OR REPLACE FUNCTION fruit_qty_larger_than(left_fruit FRUIT_QTY,
                                                 right_fruit FRUIT_QTY)
    RETURNS BOOL
AS
$
BEGIN
    IF (left_fruit.name = 'APPLE' AND right_fruit.name = 'ORANGE')
    THEN
        RETURN left_fruit.qty > (1.5 * right_fruit.qty);
    END IF;
    IF (left_fruit = 'ORANGE' AND right_fruit.name = 'APPLE')
    THEN
        RETURN (1.5 * left_fruit.qty) > right_fruit.qty;
    END IF;
    RETURN left_fruit.qty > right_fruit.qty;
END ;
$
    LANGUAGE plpgsql;

2 测试代码是否正确

SELECT fruit_qty_larger_thanFRUIT_QTY, '("ORANGE",2)'::FRUIT_QTY;
true
SELECT fruit_qty_larger_thanFRUIT_QTY, '("ORANGE",2)'::FRUIT_QTY;
false