postgresql 自动类型转换
一、错误案例
1、赋值错误:
ERROR druid.sql.Statement:149 - {conn-10005, pstmt-20005} execute error. UPDATE sys_permission SET parent_id=? is_leaf=? internal_or_external=? WHERE id=?
org.postgresql.util.PSQLException: 错误: 字段 "is_leaf" 的类型为 integer, 但表达式的类型为 boolean 建议:你需要重写或转换表达式 位置:126 (在jeecgboot平台的菜单管理中会出现该问题)
解决方法:
update pg_cast set castcontext='a' where castsource ='boolean'::regtype and casttarget='integer'::regtype;
2、查询错误:
ERROR druid.sql.Statement:149 - {conn-10005, pstmt-20003} execute error. SELECT * FROM QRTZ_FIRED_TRIGGERS WHERE SCHED_NAME = 'quartzScheduler' AND INSTANCE_NAME = ? AND REQUESTS_RECOVERY = ?
org.postgresql.util.PSQLException: 错误: 操作符不存在: character varying = boolean
建议:没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
解决方法:
update pg_cast set castcontext='i' where castsource ='boolean'::regtype and casttarget='text'::regtype;
update pg_cast set castcontext='i' where castsource ='boolean'::regtype and casttarget='character'::regtype;
update pg_cast set castcontext='i' where castsource ='boolean'::regtype and casttarget='character varying'::regtype;
用该方法之后应该可以执行转换了,但是有可能把true转换成"true"存到数据库中,这个时候,就需要用实例2的方法了
二、知识点总结
PostgreSQL 数据类型直接有3种转换,隐式转换,赋值转换,显式转换;对应的转换类型存在系统表 pg_cast中
三种方式分别对应 i(Implicit),a(Assignment),e(Explicit)
查询所有转换:
select castsource::regtype,casttarget::regtype,castcontext,castfunc from pg_cast where castsource='boolean'::regtype;
三者的转换关系为 i > a > e;意思是可以隐式转换的一定可以赋值转换和显式转换;可以赋值转换的一定可以显式转换
可以显式转换的不能隐式转换和赋值转换。i:主要用户表达式和赋值,a主要用于赋值。
https://github.com/digoal/blog/blob/master/201801/20180131_01.md
相关文章:
https://blog.csdn.net/qq_39727113/article/details/105371412
三、pg_cast中有的可以进行update,如果没有的可以create新的cast
实例1:自动将TEXT转换为TIMESTAMP
如果没有内置的转换函数,我们可能需要自定义转换函数来支持这种转换。(如果不需要转换函数:WITHOUT FUNCTION)
--创建转换fun
create or replace function cast_text_to_timestamp(text) returns timestamptz as $$
select to_timestamp($1, 'yyyy-mm-dd hh24:mi:ss');
$$ language sql strict ; --创建cast规则
create cast (text as timestamptz) with function cast_text_to_timestamp as ASSIGNMENT; --使用cast进行操作
insert into tbl123 values (1, text '2017-01-01 10:00:00');
实例2、自动将boolean转成text类型,注意integer的不要转
//创建fun
create or replace function bool_to_character(boolean) returns text as $$
select CAST($1::int as text);
$$ language sql strict; --这行创建cast会报错:类型 boolean 到 text 的转换已经存在,因此这行执行不了,只能用下面3行代码的方法进行update
create cast (bool as text) with function bool_to_character(boolean) as implicit; --更新cast(3种text类型都要处理character varying,character,text),先找fun的id,然后再找casttarget
update pg_cast set castcontext='i',castfunc=42127 where castsource ='boolean'::regtype and casttarget='text'::regtype; --查询casttarget
select castsource::regtype,casttarget::regtype,castcontext,castfunc from pg_cast where castsource='boolean'::regtype; --根据fun查询id:
SELECT oid,proname FROM pg_proc WHERE proname='bool_to_character'
四、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 ]
解释:
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。
本文参考文章:https://www.jb51.net/article/203366.htm
postgresql 自动类型转换的更多相关文章
- PostgreSQL 自定义自动类型转换(CAST)
转载自:https://yq.aliyun.com/articles/228271 背景 PostgreSQL是一个强类型数据库,因此你输入的变量.常量是什么类型,是强绑定的,例如 在调用操作符时,需 ...
- JavaScript系列文章:自动类型转换-续
在上一篇文章中,我们详细讲解了JavaScript中的自动类型转换,由于篇幅限制,没能覆盖到所有的转换规则,这次准备详细讲解一下. 上次我们提到了对象类型参与运算时转换规则: 1). 在逻辑环境中执行 ...
- JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- struts基于ognl的自动类型转换需要注意的地方
好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...
- postgresql数据类型转换
PostgreSQL数据类型转换需要使用语法 alter table tbname alter column fieldname type date_type 遇到需要转换为特殊类型如DATE.BOO ...
- 慕课网-安卓工程师初养成-2-9 Java中的自动类型转换
来源:http://www.imooc.com/code/1236 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型变量 score1 可以直接为 ...
- 【转】JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- c语言的自动类型转换
转自c语言的自动类型转换 自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.如 ...
- C语言自动类型转换
自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.(eg:int型和long型运算时,先把int量转成lo ...
- python小白——进阶之路——day2天-———变量的缓存机制+自动类型转换
# ###同一文件,变量的缓存机制 ''' -->Number 部分 1.对于整型而言,-5~正无穷范围内的相同值 id一致 2.对于浮点数而言,非负数范围内的相同值 id一致 3.布尔值而言, ...
随机推荐
- ET8.1(一)简介
此系列文章逐个内容讲解ET8.1的新特性. ET8.1 发布,带来以下新特性: 1. 多线程多进程架构,架构更加灵活强大,多线程设计详细内容请看多线程设计课程 2. 抽象出纤程(Fiber)的概念 ...
- 3 JavaScript字符串操作
3 字符串操作 常用的字符串操作相关的方法: s.split() 字符串切割 s.substr(start, len) 字符串切割, 从start开始切, 切len个字符 s.substring(st ...
- #二叉堆#JZOJ 4320 旅行
分析 有一个很重要的性质就是如果经过道路数为奇数,把两个点到根节点的路径长加起来就是两个点间的路径长(正负消掉了) 而且众所周知的是奇数+偶数=奇数 可以预处理每个点到根节点的路径长度(按照题目要求) ...
- 【直播回顾】OpenHarmony知识赋能五期第六课——子系统相机解读
5月26日晚上19点,知识赋能第五期第六节课 <OpenHarmony标准系统多媒体子系统之相机解读> ,在OpenHarmony开发者成长计划社群内成功举行. 本期课程,由深开鸿资 ...
- 分析即服务(AaaS)是什么?终于有人讲清楚了
随着世界数据领域的地位和规模的不断扩大,大数据.人工智能和云计算正在结合起来,以分析即服务的形式为企业提供急需的喘息机会 . 让我们简要回顾一下 2010 年以来发生的事情. 这十年来我们见证了许多技 ...
- 【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(下)
[中秋国庆不断更]HarmonyOS对通知类消息的管理与发布通知(下) 一.发布进度条类型通知 进度条通知也是常见的通知类型,主要应用于文件下载.事务处理进度显示.HarmonyOS提供了进度条模板, ...
- 如何在macOS上安装Python3并设置本地编程环境
介绍 Python是一种多功能编程语言,可用于许多不同的编程项目.1991年首次出版,其名称灵感来自英国喜剧组织Monty Python,开发团队希望使Python成为一种有趣的语言.易于设置,并以相 ...
- c# Barrier 线程回调
前言 假如现在有一个这样的需求,我一堆小黄人生产小黄丹,而大黄人要一直吃小黄丹. 如果是这样的话,想到就是一堆小黄人作为一个多线程,然后一直制造,然后另外一个大黄人一直检索是否有小黄丹,有就吃掉. 但 ...
- WPF随笔收录-RestSharp下载文件406问题
一.前言 在项目开发过程中,涉及到通过http下载文件的需求,最近遇到一个406问题,由于第一次接触这个问题,也被问题卡了好久,在网上风暴了很久才找到解决办法: 二.解决方法 解决的办法就是在requ ...
- 力扣607(MySQL)-销售员(简单)
题目: 表: SalesPerson 表: Company 表: Orders 编写一个SQL查询,报告没有任何与名为 "RED" 的公司相关的订单的所有销售人员的姓名. 以 任意 ...