Postgresql数据库的一些字符串操作函数
Postgresql数据库的一些字符串操作函数
最近开始研究PostgreSQL的相关知识,写了一个简单的存储结构,慢慢的发现PostgreSQL还是很值得去研究的
www.zzzyk.com
--
-- 建立小时记录与日记录的关联规则
DROP FUNCTION IF EXISTS group_tbl_moburlvisit
(name, timestamp);
CREATE FUNCTION group_tbl_moburlvisit
(
_tgrp name,
_tick timestamp
)
RETURNS name
AS $$
DECLARE
_strtick name;
_grpname name;
_tbregex name;
_subtbl name;
_grps name;
_gfmt name;
_tfmt name;
_tmp integer;
_cursor refcursor;
BEGIN
-- 确保只能从比汇聚时间小一个级别的数据中进行汇聚
IF _tgrp = 'H1' THEN _grps = '1Hour'; _gfmt = 'YYYYMMDDHH24'; _tfmt = 'YYYYMMDDHH24..';
ELSIF _tgrp = 'D1' THEN _grps = '1Day'; _gfmt = 'YYYYMMDD'; _tfmt = 'YYYYMMDD..';
ELSIF _tgrp = 'M1' THEN _grps = '1Month'; _gfmt = 'YYYYMM'; _tfmt = 'YYYYMM..';
ELSIF _tgrp = 'Y1' THEN _grps = '1Year'; _gfmt = 'YYYY'; _tfmt = 'YYYY..';
END IF;
_grpname := 'tbl_moburlvisit_' || to_char(_tick, _gfmt);
_tbregex := 'tbl_moburlvisit_' || to_char(_tick, _tfmt);
RAISE DEBUG 'Group for %, To: %, From: %', _grps, _grpname, _tbregex;
-- 获取所有符合命名规则的表,如无则退出
EXECUTE 'SELECT count(*) FROM pg_class WHERE relname ~ ' || quote_literal(_tbregex) INTO _tmp;
IF _tmp <> 0 THEN
RAISE DEBUG 'Group % sub-tables into %', _tmp, _grpname;
ELSE
RAISE DEBUG 'Sub-tables not found: %', quote_literal(_tbregex);
RETURN NULL;
END IF;
-- 检查现有复合表的子表关系,并将该子表和复合表的继承关系去除
www.zzzyk.com
EXECUTE 'select count(*) from pg_class where relname = ' || quote_literal(_grpname) INTO _tmp;
IF _tmp <> 0 THEN
OPEN _cursor FOR EXECUTE 'select a.relname from pg_catalog.pg_class a join pg_catalog.pg_inherits b on a.oid = b.inhrelid join pg_catalog.pg_class c on b.inhparent = c.oid where c.relname = ' || quote_literal(_grpname);
LOOP
FETCH _cursor INTO _subtbl;
IF NOT FOUND THEN EXIT; END IF;
RAISE DEBUG 'Cut table % from %', _subtbl, _grpname;
EXECUTE 'ALTER TABLE ' || _subtbl || ' NO INHERIT ' || _grpname;
END LOOP;
CLOSE _cursor;
-- 检查现有复合表,如有则删除
EXECUTE 'DROP TABLE IF EXISTS ' || _grpname;
END IF;
-- 建立复合表
EXECUTE 'CREATE TABLE ' || _grpname || '
(
id_moburlvisit BIGINT NOT NULL,
mob BIGINT NOT NULL,
lac INTEGER NOT NULL,
ci INTEGER NOT NULL,
id_urlrule INTEGER NOT NULL,
id_uarule INTEGER NOT NULL,
tick TIMESTAMP NOT NULL,
rate INTEGER NOT NULL,
pv INTEGER NOT NULL
)
WITH (OIDS=FALSE)';
-- 检查各子表,并将该子表添加进复合表 www.zzzyk.com
OPEN _cursor FOR EXECUTE 'SELECT relname FROM pg_class WHERE relname ~ ' || quote_literal(_tbregex);
LOOP
FETCH _cursor INTO _subtbl;
IF NOT FOUND THEN EXIT; END IF;
RAISE DEBUG 'Group table % into %', _subtbl, _grpname;
EXECUTE 'ALTER TABLE ' || _subtbl || ' INHERIT ' || _grpname;
END LOOP;
CLOSE _cursor;
RETURN _grpname;
END;
$$ LANGUAGE PLpgSQL;
其中查看了很多的相关博客,我也来总结一下PostgreSQL里面的字符串相关的函数吧!
函数:string || string
说明:String concatenation 字符串连接操作 www.zzzyk.com
例子:select 'Post' || 'greSQL'; = PostgreSQL
函数:string || non-string or non-string || string
说明:String concatenation with one non-string input 字符串与非字符串类型进行连接操作
例子:select 'Value: ' || 42; = Value: 42
函数:bit_length(string)
说明:Number of bits in string 计算字符串的位数
例子:select bit_length('pmars') = 40
函数:char_length(string) or character_length(string)
说明:Number of characters in string 计算字符串中字符个数
例子:select char_length('pmars'); = 5
www.zzzyk.com
函数:lower(string)
说明:Convert string to lower case 转换字符串为小写
例子:select lower('PmArS'); = "pmars"
函数:octet_length(string)
说明:Number of bytes in string 计算字符串的字节数
例子:select octet_length('我是pmars'); = 11 select octet_length('我'
- 更多SQLServer疑问解答:
- 配置MSSQL复制指定快照文件夹提示:不是有效的路径或文件名
- 详细解读varchar和Nvarchar区别
- SQL SERVER 2005 同步复制技术
- 进程未能大容量复制到表 解决方法
- MSSql实例教程:MSSql数据库同步
- SQLServer2000同步复制技术实现(分发和订阅)
- sqlserver
- SQLSERVER
- 测试 sqlserver 最大用户数连接
- 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的
- sqlserver2008的安装问题。
- 为什么安装的SQL server 2008我的没有MSSQLSERVER协议啊?
- 怎样把exel表里的数据复制到sqlserver表里
- sqlserver数据库主键和外键问题
- sqlserver 中的左表连接查询和右表连接查询有啥不同?有什么用?