PostgreSQL alter column type 1 to type 2 using express or auto cast

在使用数据库时,有些应用开发人员可能喜欢使用数值来表示布尔逻辑值,或者在最初定义一个字段的状态时使用的类型,将来不能表达所有的值。
未来则可能需要对字段进行转换,例如数值转换为布尔,或者布尔转换为数值。
还有的时候,一开始可能使用了大量的重复文本,在进行统计时,文本比整型的效率低,在进入仓库后可能需要字典化这些文本(例如APPNAME) , 也会涉及字段类型的转换。
例子:

postgres=# create table tbl(id int, stat numeric(1));
CREATE TABLE

postgres=# insert into tbl select id,0 from generate_series(1,1000) t(id);
INSERT 0 1000
postgres=# insert into tbl select id,1 from generate_series(1001,2000) t(id);
INSERT 0 1000

postgres=# create or replace function n_to_b(numeric) returns boolean as $$
  select $1::int::boolean;
$$ language sql;
CREATE FUNCTION
postgres=# select n_to_b(1);
 n_to_b
--------
 t
(1 row)

postgres=# select n_to_b(10);
 n_to_b
--------
 t
(1 row)

postgres=# select n_to_b(0);
 n_to_b
--------
 f
(1 row)

postgres=# select n_to_b(-1);
 n_to_b
--------
 t
(1 row)

postgres=# alter table tbl alter column stat type boolean using stat::int::boolean;
ALTER TABLE

postgres=# select * from tbl limit 10;
 id | stat
----+------
  1 | f
  2 | f
  3 | f
  4 | f
...

字典化

postgres=# create table test(id int, info text);
CREATE TABLE
postgres=# insert into test select id,'string a' from generate_series(1,100000) t(id);
INSERT 0 100000
postgres=# insert into test select id,'string b' from generate_series(1,100000) t(id);
INSERT 0 100000
postgres=# insert into test select id,'string c' from generate_series(1,100000) t(id);
INSERT 0 100000

postgres=# create or replace function fun(text) returns int as $$
declare
begin
case $1
  when 'string a' then return 0;
  when 'string b' then return 1;
  when 'string c' then return 2;
  else return 9999;
  end case;
end;
$$ language plpgsql strict;
CREATE FUNCTION
postgres=# select fun('a');
 fun
------
 9999
(1 row)

postgres=# select fun('string a');
 fun
-----
   0
(1 row)

postgres=# alter table test alter column info type int using fun(info);
ALTER TABLE
postgres=# select * from test where id=1 limit 5;
 id | info
----+------
  1 |    0
  1 |    1
  1 |    2
(3 rows)

还有时,会涉及文本转数值,也可以使用类似的方法:
你可能需要用到to_number或者自定义函数(例如对于带有非数值的字符串,返回一个固定值)

postgres=# select to_number('123ab2','999')
postgres-# ;
 to_number
-----------
       123
(1 row)

postgres=# select to_number('123ab2','999');
 to_number
-----------
       123
(1 row)

postgres=# select to_number('1a123ab2','999');
 to_number
-----------
        11
(1 row)

postgres=# select to_number('1a123ab2','999999999999');
 to_number
-----------
     11232
(1 row)
时间: 2024-11-08 23:28:47

PostgreSQL alter column type 1 to type 2 using express or auto cast的相关文章

delphi could not convert variant of type (null) into type (olestr)

问题描述 delphi could not convert variant of type (null) into type (olestr) procedure TForm3.DBEdit1Change(Sender: TObject); //onchange事件 var i:integer; s:string; xcom:tcomponent; begin for i := 2 to 20 do begin s:='edit'+inttostr(i); xcom:=findcomponent

no result type defined for type 'dispatch'mapped

自己打算弄个webwork测试问题时候,遇到个脑瘫的问题,配了xwork之后,死活找不到action,报There is no result type defined for type 'dispatcher' mapped with name 'success' 的错误,找了半天,发现需要在xwork配置文件中加入: <include file="webwork-default.xml"/> <package name="helloWorld"

Golang中对interface{}做type assertion和type switch学习笔记

interface{}是一个通用类型,可以储存任意类型的值.如下方法来获取值的实际类型: 如果你比较确定类型可以使用type assertion: var num interface{} = 100 if val,ok := num.(int); ok {     fmt.Println(val) } 如果你不确定interface{}的具体类型,使用type switch: var str interface{} = "abc"   switch v := str.(type) {

Cisco ospf type和network type

本文主要讲述了路由器OSPF的metrics类型和OSPF的机制和做为链路状态协议的特点和几种LSA的作用.有助于OSPF的深入理解.下面文章将给予介绍.IA - OSPF inter areaN1 - OSPF NSSA external type 1N2 - OSPF NSSA external type 2E1 - OSPF external type 1E2 - OSPF external type 2ospf有两种metrics值:type1 和 type 2type 1 metric

Pure PostgreSQL实现推荐系统

Pure PostgreSQL实现推荐系统 推荐系统大家都熟悉哈,猜你喜欢,淘宝个性化什么的,前年双十一搞了个大新闻,拿了CEO特别贡献奖. 今天就来说说怎么用PostgreSQL 3分钟实现一个最简单ItemCF推荐系统,以推荐系统最喜闻乐见的movielens数据集为例. 原理 Item CF,全称Item Collaboration Filter,即基于物品的协同过滤,是目前业界应用最多的推荐算法.ItemCF不需要物品与用户的标签.属性,只要有用户对Item的行为日志就可以了,同时具有很

PostgreSQL on ECS SLA 流复制备库+秒级快照+PITR+自动清理

标签 PostgreSQL , ECS , 阿里云 , 部署 , 物理镜像 , 流复制 , 快照备份 , 备份验证 , 自动清理 背景 介绍在阿里云ECS环境中,实现一个非常简单,但是可用性和可靠性满足一般企业要求的PostgreSQL环境. 包括: 1.自动启动数据库 2.包括一个物理流复制备库 3.包括自动的秒级快照备份 4.包括自动备份集有效性验证 5.包括自动清理N天以前的备份集.归档文件 6.监控请自建 部署环境介绍 1.ECS 111.111.111.199 (主) 111.111.

DB2 常用操作命令集合

1. 打开命令行窗口  #db2cmd  2. 打开控制中心  # db2cmd db2cc  3. 打开命令编辑器  db2cmd db2ce  =====操作数据库命令=====  4. 启动数据库实例  #db2start  5. 停止数据库实例  #db2stop  如果你不能停止数据库由于激活的连接,在运行db2stop前执行db2 force application all就可以了 /db2stop force  6. 创建数据库  #db2 create db [dbname] 

SQL语句的基本操作

  --创建数据库 create database Etp; --连接数据库 connect to Etp; --断开连接 disconnect Etp; --查看当前数据库下有哪些表 list tables; --建表 create table studentInfo(  stuno char(5) not null,  stuname varchar(8),  stubirth date ); --查看表结构 describe table studentinfo; --新增表字段 alter

Vertia的这些事&amp;lt;一&amp;gt;—— 关于vertica的常用操作

在工作中用到vertica,环境都是直接HP的人来部署的,在网上查也很少有学习资料,一下总结了一部分常用操作,仅供参考: 进入vertica的sql环境:vsql -d dbname -w passwd 创建序列:CREATE SEQUENCE sq1 MAXVALUE 5000 START 1; 使用序列:SELECT NEXTVAL('my_seq'); 删除序列:DROP SEQUENCE seq_name; 修改列名:alter table csaprp.tb_rp_ct_olcs_wo