# 创建演员表

CREATE CAST — 定义一个新的演员表

# 概要

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 ]

# 描述

创建演员表定义了一个新的演员表。强制转换指定如何在两种数据类型之间执行转换。例如,

SELECT CAST(42 AS float8);

将整数常量 42 转换为类型浮动8通过调用先前指定的函数,在这种情况下浮动8(int4).(如果没有定义合适的演员表,则转换失败。)

可以有两种类型二进制可强制,这意味着可以“免费”执行转换,而无需调用任何函数。这要求对应的值使用相同的内部表示。例如,类型文本varchar是双向可强制的。二元强制力不一定是对称关系。例如,演员阵容来自xml文本在本实现中可以免费执行,但反向需要一个至少执行语法检查的函数。(双向可二进制强制的两种类型也称为二进制兼容。)

您可以将强制转换定义为I/O 转换转换通过使用带输入句法。通过调用源数据类型的输出函数并将结果字符串传递给目标数据类型的输入函数来执行 I/O 转换转换。在许多常见情况下,此功能避免了编写单​​独的强制转换函数进行转换的需要。I/O 转换转换的行为与常规的基于函数的转换相同;只有实现不同。

默认情况下,只能通过显式转换请求调用转换,即显式转换请求投掷(*x* 作为 *类型名称*)或者*x::类型名称*构造。

如果演员表被标记作业然后在为目标数据类型的列赋值时可以隐式调用它。例如,假设foo.f1是类型的列文本, 然后:

INSERT INTO foo (f1) VALUES (42);

如果从类型转换将被允许整数输入文本被标记作业,否则不是。(我们一般用这个词分配演员表来描述这种演员阵容。)

如果演员表被标记隐含的那么它可以在任何上下文中隐式调用,无论是赋值还是表达式内部。(我们一般用这个词隐式转换来描述这种类型的演员。)例如,考虑这个查询:

SELECT 2 + 4.0;

解析器最初将常量标记为类型整数数字分别。没有整数 + 数字操作员在系统目录中,但有一个数字 + 数字操作员。因此,如果从整数数字可用并标记隐含的——事实上就是这样。解析器将应用隐式转换并解析查询,就好像它已经被写入一样

SELECT CAST ( 2 AS numeric ) + 4.0;

现在,目录还提供了来自数字整数.如果该演员表被标记隐含的- 它不是 - 那么解析器将面临在上述解释和强制转换的替代方案之间进行选择数字恒定到整数并应用整数 + 整数操作员。如果不知道更喜欢哪个选择,它会放弃并声明查询不明确。两个强制转换中只有一个是隐式的这一事实是我们教解析器更喜欢混合的解析的方式数字-和-整数表达为数字;没有关于此的内置知识。

保守地将演员表标记为隐式是明智的。过多的隐式转换路径会导致 PostgreSQL 选择令人惊讶的命令解释,或者根本无法解析命令,因为有多种可能的解释。一个好的经验法则是使强制转换仅可用于同一通用类型类别中的类型之间的信息保留转换。例如,演员阵容来自整数2整数4可以合理地隐含,但从浮动8整数4应该可能只是分配。跨类型类别转换,例如文本整数4, 最好只显式。

# 笔记

有时出于可用性或标准合规性的原因,有必要在一组类型之间提供多个隐式转换,从而导致如上所述无法避免的歧义。解析器具有基于回退启发式类型类别首选类型这有助于在这种情况下提供所需的行为。看创建类型了解更多信息。

为了能够创建强制转换,您必须拥有源或目标数据类型并拥有用法其他类型的特权。要创建二进制强制转换,您必须是超级用户。(这个限制是因为错误的二进制强制转换很容易使服务器崩溃。)

# 参数

源类型

转换的源数据类型的名称。

目标类型

转换的目标数据类型的名称。

*函数名*[(*参数类型* [, ...])]

用于执行强制转换的函数。函数名称可以是模式限定的。如果不是,则将在模式搜索路径中查找该函数。函数的结果数据类型必须匹配转换的目标类型。下面讨论它的论点。如果未指定参数列表,则函数名称在其模式中必须是唯一的。

没有功能

表示源类型对目标类型是二进制强制的,因此不需要函数来执行转换。

带输入

表示强制转换是 I/O 转换强制转换,通过调用源数据类型的输出函数并将结果字符串传递给目标数据类型的输入函数来执行。

作业

表示可以在赋值上下文中隐式调用强制转换。

AS IMPLICIT

Indicates that the cast can be invoked implicitly in any context.

Cast implementation functions can have one to three arguments. The first argument type must be identical to or binary-coercible from the cast's source type. The second argument, if present, must be typeinteger; it receives the type modifier associated with the destination type, or-1if there is none. The third argument, if present, must be typeboolean; it receivestrueif the cast is an explicit cast,falseotherwise. (Bizarrely, the SQL standard demands different behaviors for explicit and implicit casts in some cases. This argument is supplied for functions that must implement such casts. It is not recommended that you design your own data types so that this matters.)

The return type of a cast function must be identical to or binary-coercible to the cast's target type.

Ordinarily a cast must have different source and target data types. However, it is allowed to declare a cast with identical source and target types if it has a cast implementation function with more than one argument. This is used to represent type-specific length coercion functions in the system catalogs. The named function is used to coerce a value of the type to the type modifier value given by its second argument.

When a cast has different source and target types and a function that takes more than one argument, it supports converting from one type to another and applying a length coercion in a single step. When no such entry is available, coercion to a type that uses a type modifier involves two cast steps, one to convert between data types and a second to apply the modifier.

A cast to or from a domain type currently has no effect. Casting to or from a domain uses the casts associated with its underlying type.

# Notes

UseDROP CASTto remove user-defined casts.

Remember that if you want to be able to convert types both ways you need to declare casts both ways explicitly.

It is normally not necessary to create casts between user-defined types and the standard string types (text,varchar, andchar(*n*),以及定义为字符串类别的用户定义类型)。PostgreSQL 为此提供了自动 I/O 转换转换。对字符串类型的自动转换被视为赋值转换,而来自字符串类型的自动转换是仅显式的。您可以通过声明自己的强制转换来替换自动强制转换来覆盖此行为,但通常这样做的唯一原因是,如果您希望转换比标准的仅赋值或仅显式设置更容易调用。另一个可能的原因是您希望转换的行为与类型的 I/O 函数不同;但这足以令人惊讶,您应该三思而后行是否是个好主意。(少数内置类型确实有不同的转换行为,主要是因为 SQL 标准的要求。)

虽然不是必需的,但建议您继续遵循在目标数据类型之后命名强制转换实现函数的旧约定。许多用户习惯于使用函数式表示法来转换数据类型,即*类型名称(x*)。这种表示法实际上只不过是对强制转换实现函数的调用;它没有被特殊对待。如果你的转换函数没有被命名来支持这个约定,那么你会让用户感到惊讶。由于 PostgreSQL 允许使用不同的参数类型重载相同的函数名称,所以从不同类型的多个转换函数都使用目标类型的名称没有困难。

# 笔记

实际上,前面的段落过于简单化了:在两种情况下,函数调用构造将被视为强制转换请求,而无需将其与实际函数匹配。如果一个函数调用*姓名(x) 不完全匹配任何现有函数,但姓名是数据类型的名称,并且pg_castx*,然后调用将被解释为二进制强制转换。这个例外是为了使二进制强制转换可以使用函数式语法调用,即使它们缺少任何函数。同样,如果没有pg_cast条目,但转换将是到字符串类型或从字符串类型转换,调用将被解释为 I/O 转换转换。此异常允许使用函数式语法调用 I/O 转换强制转换。

# 笔记

该异常还有一个例外:从复合类型到字符串类型的 I/O 转换转换不能使用函数式语法调用,而必须以显式转换语法编写(或者投掷或者::符号)。之所以添加此异常,是因为在引入自动提供的 I/O 转换强制转换后,当打算引用函数或列时,很容易意外调用这种强制转换。

# 例子

从类型创建赋值转换大整数输入整数4使用功能int4(大整数)

CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;

(此演员表已在系统中预定义。)

# 兼容性

创建演员表command 符合 SQL 标准,只是 SQL 没有为实现函数提供二进制强制类型或额外参数。隐含的也是一个 PostgreSQL 扩展。

# 也可以看看

创建函数, 创建类型, 空投