假定您想要定义单值类型来表示 dollar、yen 和 sterling 货币。两种货币之间的任何比较都必须考虑汇率。因此,您必须创建的强制转型函数不仅需要处理从一种数据类型到另一种数据类型的强制转型,还需要计算要比较的值的汇率。
CREATE DISTINCT TYPE dollar AS DOUBLE PRECISION; CREATE DISTINCT TYPE yen AS DOUBLE PRECISION; CREATE DISTINCT TYPE sterling AS DOUBLE PRECISION;
CREATE TABLE manufact_price ( product_desc VARCHAR(20), us_price dollar, japan_price yen, uk_price sterling );
INSERT INTO manufact_price VALUES ('baseball', 5.00::DOUBLE PRECISION::dollar, 510.00::DOUBLE PRECISION::yen, 3.50::DOUBLE PRECISION::sterling);
由于单值类型不继承任何可用于其源类型的内置强制转型,所以前面每个 INSERT 语句都要求进行两次强制转型。对于每个 INSERT 语句,内部强制转型从 DECIMAL 转换为 DOUBLE PRECISION,外部强制转型从 DOUBLE PRECISION 转换为正确单值类型(dollar、yen 或 sterling)。
CREATE FUNCTION dollar_to_yen(d dollar) RETURN (d::DOUBLE PRECISION * 106)::CHAR(20)::yen; END FUNCTION; CREATE FUNCTION sterling_to_dollar(s sterling) RETURNS dollar RETURN (s::DOUBLE PRECISION * 1.59)::CHAR(20)::dollar; END FUNCTION;
CREATE CAST(dollar AS yen WITH dollar_to_yen); CREATE CAST(sterling AS dollar WITH sterling_to_dollar);
在将函数注册为强制转型之后,将其用于需要在数据类型之间进行转换的运算。有关用来创建强制转型函数并将其注册为强制转型的语法,请参阅 GBase 8s SQL 指南:语法 中的 CREATE FUNCTION 和 CREATE CAST 语句。
SELECT * FROM manufact_price WHERE CAST(us_price AS yen) < japan_price;
SELECT * FROM manufact_price WHERE us_price::yen < japan_price;
SELECT us_price::yen, japan_price FROM manufact_price WHERE us_price::yen < japan_price;