create type/cast/ENUM
enum:http://www.postgresql.org/docs/9.3/static/datatype-enum.html,http://www.postgresql.org/docs/9.3/static/functions-enum.html
digoal=# CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); CREATE TYPE digoal=# CREATE TABLE person ( digoal(# name text, digoal(# current_mood mood digoal(# ); CREATE TABLE digoal=# INSERT INTO person VALUES ('Moe', 'happy'); INSERT 0 1 digoal=# SELECT * FROM person; name | current_mood ------+-------------- Moe | happy (1 row) digoal=# select enum_first(null::mood); enum_first ------------ sad (1 row) digoal=# select enum_range('ok'::mood,null); enum_range ------------ {ok,happy} (1 row)
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 ] WITHOUT FUNCTION: 表示源数据类型和目标数据类型是二进制兼容的, 所以不需要什么函数来执行转换。 AS ASSIGNMENT: 表示转换可以在赋值环境里隐含调用。 AS IMPLICIT: 表示这个转换可以在任何环境里隐含调用。
digoal=# select cast(24 as text); text ------ 24 (1 row) digoal=# CREATE OR REPLACE FUNCTION increment(i integer) RETURNS text AS $$ digoal$# BEGIN digoal$# RETURN 'aaaaa'||i; digoal$# END; digoal$# $$ LANGUAGE plpgsql; CREATE FUNCTION digoal=# CREATE CAST (int AS text) WITH FUNCTION increment(int) AS ASSIGNMENT; CREATE CAST digoal=# select cast(24 as text); text --------- aaaaa24 (1 row) digoal=# drop cast (int as text); DROP CAST digoal=# select cast(24 as text); text ------ 24 (1 row) digoal=# select 2>=cast(24 as text)||''; ERROR: operator does not exist: integer >= text LINE 1: select 2>=cast(24 as text)||''; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. digoal=# CREATE CAST (int AS text) WITH FUNCTION increment(int) AS IMPLICIT; CREATE CAST digoal=# select 2>=cast(24 as text)||''; ?column? ---------- false (1 row)