单值数据类型之间强制转型的示例

假定您想要定义单值类型来表示 dollar、yen 和 sterling 货币。两种货币之间的任何比较都必须考虑汇率。因此,您必须创建的强制转型函数不仅需要处理从一种数据类型到另一种数据类型的强制转型,还需要计算要比较的值的汇率。

以下示例显示如何对同一源类型 DOUBLE PRECISION 定义三种单值类型:
CREATE DISTINCT TYPE dollar AS DOUBLE PRECISION;
CREATE DISTINCT TYPE yen AS DOUBLE PRECISION;
CREATE DISTINCT TYPE sterling AS DOUBLE PRECISION;
定义单值类型后,您可以创建一个表,这个表提供制造商对可比较产品开出的价格。以下示例创建 manufact_price 表,这个表对 dollar、yen 和 sterling 单值类型各包含一列:
CREATE TABLE manufact_price 
( 
product_desc  VARCHAR(20),
us_price      dollar, 
japan_price   yen, 
uk_price      sterling
);
在将值插入 manufact_price 表时,可以强制转型为 dollar、yen 和 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)。

在可以对 dollar、yen 和 sterling 数据类型作比较之前,必须创建强制转型函数并将它们注册为强制转型。以下示例创建可用来对 dollar、yen 和 sterling 值作比较的 SPL 函数。每个函数都将输入值乘以一个反映汇率的值。
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_to_yen()sterling_to_dollar() 函数注册为显式强制转型:
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 语句。

在以下查询中,WHERE 子句包含一个显式强制转型,该强制转型调用 dollar_to_yen() 函数来对 dollar 与 yen 值进行比较:
SELECT * FROM manufact_price 
      WHERE CAST(us_price AS yen) < japan_price;
以下查询使用强制转型运算符来执行上述查询中显示的同一转换:
SELECT * FROM manufact_price 
      WHERE us_price::yen < japan_price;
也可以使用显式强制转型来转换查询返回的值。以下查询使用强制转型来返回与 dollar 值相等的 yen 值。该查询的 WHERE 子句还使用显式强制转型来将 dollar 与 yen 值作比较。
SELECT us_price::yen, japan_price FROM manufact_price
      WHERE us_price::yen < japan_price;