On this page
Note
CREATE CAST
CREATE CAST-定义新的演员表
Synopsis
CREATE CAST (source_type AS target_type)
WITH FUNCTION function_name [ (argument_type [, ...]) ]
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (source_type AS target_type)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (source_type AS target_type)
WITH INOUT
[ AS ASSIGNMENT | AS IMPLICIT ]
Description
CREATE CAST
定义了一个新的演员表。强制转换指定如何在两种数据类型之间执行转换。例如,
SELECT CAST(42 AS float8);
通过调用先前指定的函数(在本例中为float8(int4)
)将整数常量 42 转换为类型float8
。 (如果未定义适当的转换,则转换将失败.)
- binary coercible *可以是两种类型,这意味着可以“免费”执行转换而无需调用任何功能。这要求相应的值使用相同的内部表示形式。例如,类型
text
和varchar
都是双向强制的。二进制强制性不一定是对称关系。例如,在本实施方式中可以免费执行从xml
到text
的转换,但是相反的方向需要至少执行语法检查的功能。 (两种都可以二进制强制的类型也称为二进制兼容.)
您可以使用WITH INOUT
语法将转换定义为* I/O 转换转换*。通过调用源数据类型的输出函数并将结果字符串传递给目标数据类型的 Importing 函数来执行 I/O 转换转换。在许多常见情况下,此功能无需编写单独的强制转换函数即可进行转换。 I/O 转换强制转换与基于常规功能的强制转换相同;只是实现不同。
默认情况下,只能由显式强制转换请求调用强制转换,即显式CAST(x AS typename)
或* x
* ::
* typename
*构造。
如果强制转换标记为AS ASSIGNMENT
,则可以在为目标数据类型的列分配值时隐式调用它。例如,假设foo.f1
是text
类型的列,则:
INSERT INTO foo (f1) VALUES (42);
如果从类型integer
到类型text
的转换标记为AS ASSIGNMENT
,则将被允许,否则。 (我们通常使用术语* assignment cast *来描述这种类型的转换.)
如果强制转换标记为AS IMPLICIT
,则可以在任何上下文中隐式调用它,无论是赋值还是在表达式内部。 (我们通常使用术语* implicit cast *来描述这种类型的转换.)例如,考虑以下查询:
SELECT 2 + 4.0;
解析器最初将常量标记为integer
和numeric
类型。系统目录中没有integer
+
numeric
运算符,但是有numeric
+
numeric
运算符。因此,如果从integer
到numeric
的转换可用并且标记为AS IMPLICIT
(实际上是这样),则查询将成功。解析器将应用隐式强制转换并解析查询,就像它已经被编写一样
SELECT CAST ( 2 AS numeric ) + 4.0;
现在,目录还提供了从numeric
到integer
的转换。如果该强制转换标记为AS IMPLICIT
(不是),则解析器将面临在上述解释与将numeric
常量强制转换为integer
并应用integer
+
integer
运算符的选择之间进行选择的选择。缺乏对选择哪种选择的了解,它将放弃并声明查询不明确。这两个强制转换中只有一个是隐式的,这是我们教会解析器偏向于将numeric
和integer
混合表达式解析为numeric
的方式。没有内置的知识。
保守地将强制类型转换标记为隐式是明智的。过多的隐式转换路径可能导致 PostgreSQL 选择令人惊讶的命令解释,或者因为存在多种可能的解释而根本无法解析命令。一个好的经验法则是,仅对于同一通用类型类别中的类型之间的信息保留转换,隐式调用强制类型转换。例如,从int2
到int4
的强制转换可以合理地是隐式的,但是从float8
到int4
的强制转换应该仅是赋值的。最好将跨类型类别转换(例如text
到int4
)设置为仅显式。
Note
有时,出于可用性或符合标准的原因,有必要在一组类型之间提供多个隐式强制转换,导致产生上述无法避免的歧义。解析器具有基于类型类别和首选类型的后备启发式方法,可以在这种情况下帮助提供所需的行为。有关更多信息,请参见CREATE TYPE。
为了能够创建演员表,您必须拥有源或目标数据类型,并且对另一种类型具有USAGE
特权。要创建二进制可强制转换,您必须是超级用户。 (之所以做出此限制,是因为错误的二进制强制转换转换很容易使服务器崩溃.)
Parameters
source_type
- 强制转换的源数据类型的名称。
target_type
- 强制转换的目标数据类型的名称。
function_name[(argument_type [, ...])]
- 用于执行转换的函数。函数名称可以是模式限定的。如果不是,将在模式搜索路径中查找该功能。函数的结果数据类型必须与转换的目标类型匹配。其论点在下面讨论。如果未指定参数列表,则函数名称在其架构中必须唯一。
WITHOUT FUNCTION
- 指示源类型对目标类型是二进制强制的,因此不需要任何功能即可执行转换。
WITH INOUT
- 指示强制转换是 I/O 转换强制转换,通过调用源数据类型的输出函数并将结果字符串传递给目标数据类型的 Importing 函数来执行。
AS ASSIGNMENT
- 指示可以在分配上下文中隐式调用强制类型转换。
AS IMPLICIT
- 指示可以在任何上下文中隐式调用强制转换。
强制转换实现功能可以具有一到三个参数。第一个参数类型必须与强制转换的源类型相同或可以从二进制强制转换。第二个参数(如果存在)必须为integer
;它接收与目标类型关联的类型修饰符;如果不存在,则返回-1
。第三个参数(如果存在)必须为boolean
类型;如果强制转换是显式强制转换,它将收到true
,否则将接收false
。 (Bizarrely,在某些情况下,SQL 标准对显式和隐式强制转换要求不同的行为.此参数提供给必须实现此类强制转换的函数.不建议您设计自己的数据类型,这样才有意义.)
强制转换函数的返回类型必须与强制转换的目标类型相同或可以二进制强制转换。
通常,强制转换必须具有不同的源和目标数据类型。但是,如果它具有一个带有多个参数的强制转换实现函数,则可以声明具有相同源类型和目标类型的强制转换。它用于表示系统目录中特定于类型的长度强制功能。命名函数用于将类型的值强制为由其第二个参数给出的类型修饰符值。
当强制转换具有不同的源类型和目标类型,并且一个函数使用多个参数时,它支持从一种类型转换为另一种类型,并在单个步骤中应用长度强制。如果没有这样的条目,强制转换为使用类型修饰符的类型将涉及两个强制转换步骤,一个是在数据类型之间进行转换,另一个是应用修饰符。
域类型的强制转换当前无效。向域或从域进行转换使用与其基础类型相关联的转换。
Notes
使用DROP CAST删除用户定义的演员表。
请记住,如果您希望能够同时转换类型,则需要显式声明两种转换。
通常不需要在用户定义的类型和标准字符串类型(text
,varchar
和char(n)
以及定义为字符串类别的用户定义的类型)之间创建强制类型转换。 PostgreSQL 为此提供了自动的 I/O 转换转换。字符串类型的自动强制转换被视为赋值强制转换,而字符串类型的自动强制转换仅是显式的。您可以pass 语句自己的强制转换来替换自动强制转换来覆盖此行为,但是通常这样做的唯一原因是,如果您希望转换比标准仅分配或仅显式设置更容易调用。另一个可能的原因是,您希望转换的行为与类型的 I/O 功能不同。但这令人惊讶,您应该三思而后行。 (少数内置类型的确确实具有不同的转换行为,主要是由于 SQL 标准的要求.)
虽然不是必需的,但是建议您 continue 遵循在目标数据类型之后命名强制转换实现函数的旧约定。许多用户习惯于使用函数样式表示法,即* typename
( x
*)强制转换数据类型。实际上,这种表示法无非就是对强制转换实现函数的调用。它没有被特别视为演员。如果您的转换函数未命名为支持该约定,那么您将对用户感到惊讶。由于 PostgreSQL 允许使用不同的参数类型重载相同的函数名,因此,使用不同类型的多个转换函数都使用目标类型的名称就没有困难。
Note
实际上,上一段是一个过分的简化:在两种情况下,函数调用构造将被视为强制转换请求,而没有将其与实际函数匹配。如果函数调用* name
( x
)与任何现有函数都不完全匹配,但是 name
是数据类型的名称,并且pg_cast
提供了从 x
*的类型强制转换为该类型的二进制强制转换,那么该调用将被解释为二进制强制转换。设置此异常是为了使二进制强制转换可以使用功能语法来调用,即使它们缺少任何功能。同样,如果没有pg_cast
条目,但强制类型转换为字符串类型或从字符串类型强制转换,则该调用将被解释为 I/O 转换强制类型。此异常允许使用功能语法调用 I/O 转换强制转换。
Note
exception 也有一个 exception:不能使用函数语法调用从复合类型到字符串类型的 I/O 转换,而必须使用显式的转换语法(CAST
或::
表示法)编写。添加此异常的原因是,在引入自动提供的 I/O 转换强制转换后,发现在打算使用函数或列引用时意外地调用此类强制转换太容易了。
Examples
要使用函数int4(bigint)
创建从类型bigint
到类型int4
的分配转换:
CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;
(此转换已在系统中 sched 义.)
Compatibility
CREATE CAST
命令符合 SQL 标准,但 SQL 不为二进制可强制类型或实现函数的额外参数提供准备。 AS IMPLICIT
也是 PostgreSQL 扩展。