PostgreSQL , cast
PostgreSQL是一个强类型数据库,因此你输入的变量、常量是什么类型,是强绑定的,例如
在调用操作符时,需要通过操作符边上的数据类型,选择对应的操作符。
在调用函数时,需要根据输入的类型,选择对应的函数。
如果类型不匹配,就会报操作符不存在,或者函数不存在的错误。
那么使用起来是不是很不方便呢?
PostgreSQL开放了类型转换的接口,同时也内置了很多的自动类型转换。来简化操作。
查看目前已有的类型转换:
如果你发现有些类型转换没有内置,怎么办呢?我们可以自定义转换。
当然你也可以使用这种语法,对类型进行强制转换:
自定义CAST的语法如下:
解释:
1、WITH FUNCTION,表示转换需要用到什么函数。
2、WITHOUT FUNCTION,表示被转换的两个类型,在数据库的存储中一致,即物理存储一致。例如text和varchar的物理存储一致。不需要转换函数。
3、WITH INOUT,表示使用内置的IO函数进行转换。每一种类型,都有INPUT 和OUTPUT函数。使用这种方法,好处是不需要重新写转换函数。
除非有特殊需求,我们建议直接使用IO函数来进行转换。
4、AS ASSIGNMENT,表示在赋值时,自动对类型进行转换。例如字段类型为TEXT,输入的类型为INT,那么可以创建一个 cast(int as text) as ASSIGNMENT。
5、AS IMPLICIT,表示在表达式中,或者在赋值操作中,都对类型进行自动转换。(包含了AS ASSIGNMENT,它只对赋值进行转换)
6、注意,AS IMPLICIT需要谨慎使用,为什么呢?因为操作符会涉及到多个算子,如果有多个转换,目前数据库并不知道应该选择哪个?
因此,建议谨慎使用AS IMPLICIT。建议使用AS IMPLICIT的CAST应该是非失真转换转换,例如从INT转换为TEXT,或者int转换为numeric。
而失真转换,不建议使用as implicit,例如numeric转换为int。
不能嵌套转换。例子
1、将text转换为date
错误方法
嵌套转换后出现死循环
正确方法
我们还可以直接使用IO函数来转换:
<a href="https://www.postgresql.org/docs/10/static/sql-createcast.html">https://www.postgresql.org/docs/10/static/sql-createcast.html</a>