先上SQL
CREATE OR REPLACE FUNCTION createtable_urllist_withdate() RETURNS varchar AS $BODY$ declare tableNameWithDate varchar; tableCreateSQL varchar; currentDate varchar; BEGIN SELECT INTO currentDate to_char(current_date, 'yyyymmdd'); tableNameWithDate:= 'tb_url_list_'||currentDate; if not exists(select 1 from pg_tables where tablename = tableNameWithDate) then tableCreateSQL := 'create table ' || tableNameWithDate || '( id integer primary key, URLlevel integer, URL varchar(100), title varchar(50) )'; RAISE NOTICE '开始创建表%',tableCreateSQL; EXECUTE(tableCreateSQL); RAISE NOTICE '成功创建表%',tableCreateSQL; end if; return tableNameWithDate; end; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION createurltablewithdate() OWNER TO postgres;
1.SELECT INTO
生成多个列(但只有一行)的SELECT命令的结果可以赋予一个记录变量, 行类型变量,或者一个标量变量的列表。这是用下面方法实现的:
SELECT INTO target select_expressions FROM ...;
这里的 target 可以是一个记录变量, 行变量,或者一个用逗号分隔的简单变量和记录/行字段的列表。 select_expressions 和命令的剩余部分和普通 SQL 一样。
请注意这个构造和 PostgreSQL 普通的SELECT INTO构造的解释是不一样的, 后者的INTO目标是一个新创建的表。 (如果你想在 PL/pgSQL 函数里从一个SELECT 的结果中创建一个表,那么使用 CREATE TABLE ... AS SELECT 语法。)
也就是说如果是平时使用sql的时候,如果使用select into是插入一个表,但是在pgsql中使用的时候就是插入一条记录
2.字符串操作符
字符串连接符: ||
字符串长度:bit_length(字段),char_length(字段)--中文字符算一个字长,octet(字段)--中文字符按编码算字长,例如UTF-8则一个中文字符一般是3个字长
字符串替换:overlay(字段 placing 替换string from int [for int]) 例如:select overlay(lastname placing 'gg' from 7 for 2)意思是将lastname字段中的值从第7个字符开始,用'gg'替换两个字符
字符串中某个字符的位置: position(substring in string) 例如:select position('g' in lastname)
字符串截取: substring(string from int [for int])例如:select substring(lastname from 2 for 2);substring(string from pattern)例如:select substring(lastname from '^..')
字符串大小写:lower(string),upper(string)
字符串中删除某个字符串 trim(substring from string)默认为空白符 例如:trim('123' from lastname)
通过ascii返回字符,或者通过字符返回ascii 例如:select ascii('a'); select chr('97')
3.刚开始的时候我直接创建table,发现不能给表名动态赋值。后来查了下,通过迂回能够实现,先将"create table……"字符串赋值给一个临时变量,这个时候表名已经生成,并且赋值给了临时变量,然后使用EXECUTE(string)执行。
一个比较详细的postgresql中文文档资料链接:http://www.kuqin.com/postgreSQL8.1_doc/