SYNOPSIS

CREATE CAST (sourcetype AS targettype)
WITH FUNCTION funcname (argtype)
[ AS ASSIGNMENT | AS IMPLICIT ] CREATE CAST (sourcetype AS targettype)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]

DESCRIPTION 描述

CREATE CAST 定义一个新的转换。 一个转换说明如何在两个类型之间进行转换。比如:

SELECT CAST(42 AS text);

通过调用前面声明的一个函数,把整数常量 42 转换成类型 text, 在这个例子里是 text(int4)。(如果没有预先定义好合适的转换,那么这个转换失败。)

两种类型可以是二进制兼容的, 意思是它们之间可以"自由转换"而不用调用任何函数。 这就需要那个对应的数值使用同样的内部表现形式。 比如,类型 text 和 varchar 是二进制兼容的。

缺省时,只有在明确要求转换的情况下才调用一个转换, 也就是一个明确的 CAST(x AS typename), x::typename,或者 typename(x) 构造。

如果转换标记为 AS ASSIGNMENT,那么在赋一个数值给目标数据类型的字段的时候, 可以隐含调用它。比如,假设 foo.f1 是一个类型为 text 的字段,那么

INSERT INTO foo (f1) VALUES (42);

如果从类型 integer 到类型 text 的转换标记为 AS ASSIGNMENT, 上面的这句就被允许,否则就不允许。(我们通常用术语赋值转换来描述这种转换。)

如果转换标记为 AS IMPLICIT,那么它就可以在任何环境里调用, 不管是赋值还是在表达式的内部。比如,因为 || 接受 text 操作数,

SELECT 'The time is ' || now();

将只有在类型 timestamp 到 text 的转换标记为 AS IMPLICIT 的时候才允许。否则我们就必须明确书写转换, 比如

SELECT 'The time is ' || CAST(now() AS text);

(我们通常使用术语隐含转换来描述这种类型的转换。)

在标记转换为隐含的这个问题上保守一些是明智的。 过于丰富的隐含转换路径会导致 PostgreSQL 选择让人奇怪的命令的解析, 或者是完全不能解析命令,因为存在多个可能的解析。 一条好的拇指定律是,只有在同一个通用类型表里面的那些可以保留转换信息的类型之间才标记为可隐含调用转换。 比如,从 int2 到 int4 可以合理地标记为隐含转换,但是从 float8 到 int4 可能应该是标记为赋值转换。跨类型表的转换,比如 text 到 int4,最好是只能明确地转换。

要想创建一个转换,你必须拥有源或者目的数据类型。要创建一个二进制兼容的转换, 你必须是超级用户。(做这个限制是因为一种有问题的二进制兼容转换可以很容易摧毁服务器。)

PARAMETERS 参数

sourcetype
转换的源数据类型。
targettype
转换的目标数据类型。
funcname(argtype)
用于执行转换的函数。这个函数名可以是用模式名修饰的。 如果它没有用模式名修饰,那么该函数将从路径中找出来。 参数类型必须和源数据类型相同,结果数据类型必须匹配转换的目标类型。
WITHOUT FUNCTION
表示源数据类型和目标数据类型是二进制兼容的, 所以不需要什么函数来执行转换。
AS ASSIGNMENT
表示转换可以在赋值环境里隐含调用。
AS IMPLICIT
表示这个转换可以在任何环境里隐含调用。

NOTES 注意

用 DROP CAST 删除用户定义的转换。

请注意,如果你想能双向转换类型,那么你需要明确地定义两个方向的转换。

在 PostgreSQL 7.3 之前,如果一个函数的名字和一个数据类型相同, 并且返回该种数据类型,而且还接受另外一种类型的参数自动就是一个转换函数。 这个传统随着模式的引入以及为了能在系统表种表示二进制兼容的转换就被废弃了。 (内置的转换函数仍然遵循这个命名规则,但是它们现在必须在系统表 pg_cast 里显示为转换。)

EXAMPLES 例子

要使用函数 int4(text) 创建一个从类型 text 到类型 int4的转换:

CREATE CAST (text AS int4) WITH FUNCTION int4(text);

(这个转换在系统中已经预先定义了。)

CREATE CAST - 定义一个用户定义的转换的更多相关文章

  1. DROP CAST - 删除一个用户定义的类型转换

    SYNOPSIS DROP CAST (sourcetype AS targettype) [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP CAST 删除一个前面 ...

  2. CREATE CONVERSION - 定义一个用户定义的码制转换

    SYNOPSIS CREATE [DEFAULT] CONVERSION name FOR source_encoding TO dest_encoding FROM funcname DESCRIP ...

  3. new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。

    new运算符 - JavaScript | MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operator ...

  4. DROP CONVERSION - 删除一个用户定义的编码转换

    SYNOPSIS DROP CONVERSION name [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP CONVERSION 删除一个以前定义的编码转换. 要 ...

  5. DROP TYPE - 删除一个用户定义数据类型

    SYNOPSIS DROP TYPE name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP TYPE 将从系统表里删除用户定义的类型. 只有类 ...

  6. DROP DOMAIN - 删除一个用户定义的域

    SYNOPSIS DROP DOMAIN name [, ...] [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP DOMAIN 将从系统表中删除一个用户域. 只 ...

  7. DROP AGGREGATE - 删除一个用户定义的聚集函数

    SYNOPSIS DROP AGGREGATE name ( type ) [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP AGGREGATE 将删除一个现存聚集 ...

  8. CREATE FUNCTION - 定义一个新函数

    SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...

  9. Sql server 浅谈用户定义表类型

    1.1 简介 SQL Server 中,用户定义表类型是指用户所定义的表示表结构定义的类型.您可以使用用户定义表类型为存储过程或函数声明表值参数,或者声明您要在批处理中或在存储过程或函数的主体中使用的 ...

随机推荐

  1. iOS设备,fixed布局出问题

    window.deviceId = '{{$deviceId}}'; window.iOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? t ...

  2. div+css布局教程系列2

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. BZOJ3224:普通平衡树(splay练习)

    您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. ...

  4. oracle分区表有什么作用

    oracle分区表有什么作用 https://zhidao.baidu.com/question/1818955865408544348.html (1) 表空间及分区表的概念 表空间: 是一个或多个 ...

  5. robot设置chrome mobile emulation

    https://www.testwo.com/article/361 http://blog.csdn.net/huilan_same/article/details/52856200 http:// ...

  6. Markdown——让你专注写作

    Markdown--让你专注写作 前些日子,写作的时候总会因为排版而耽误时间,甚至因为排版而把写作的专注力转移到了貌似相关的排版上.诚然,一个好的排版,会让读者有良好的体验,可是对于写作的人来说,这却 ...

  7. Ubuntu10.04安装与配置nfs服务器(转载)

    转自:http://blog.chinaunix.net/uid-25885064-id-3177969.html 1.安装nfs服务   $ sudo apt-get install nfs-ker ...

  8. bzoj 4720: [Noip2016]换教室【期望dp】

    状压dp,设f[i][j][0/1]为前i个时间段换了j间教室的期望体力消耗,转移很好想(但是写起来好长= =) #include<iostream> #include<cstdio ...

  9. bzoj 4071: [Apio2015]巴邻旁之桥【splay】

    用权值线段树会容易一些并快一些,但是想复健一下splay所以打了splay 然后果然不会打了. 解题思路: 首先把家和办公室在同一侧的提出来直接加进答案里: 对于k=1,直接选所有办公室和家的中位数即 ...

  10. Java之简单的四则运算

    简单的四则运算 请你编写程序实现能处理两个数的+.-.*./.%的表达式程序.数据的输入/输出全部使用标准输入/输出,输入数据的第一行为你需要计算表达式的个数,从第2行开始,每一行为你计算的一个表达式 ...