postgresql - 在 PostgreSQL 的 SQL 函数中将元素转换为用户定义的类型

标签 postgresql function types casting

比如说,我有复合类型 id_and_name

CREATE TYPE id_and_name AS (id integer, name text);

我想使用此 (id, name) 结构作为函数中的参数,但我希望该函数用户不需要手动转换:SELECT fun((1, '姓名')::id_and_name);用户应该熟悉 SELECT fun((1, 'name'))。这意味着我的函数参数将是 anyelement 或类似的,我应该在函数中将其转换为 id_and_name:

CREATE OR REPLACE FUNCTION fun(anyelement)
RETURNS id_and_name AS $$
    SELECT $1::id_and_name;
$$ LANGUAGE sql;

出于某种原因 SELECT fun((1, 'name')) 给我错误:

ERROR:  cannot cast type record to id_and_name
LINE 2:     SELECT $1::id_and_name;
                     ^

虽然使用替换参数的函数的相同查询工作正常:

SELECT (1, 'name')::id_and_name;

我应该如何在函数中进行此类转换?

我在 PostgreSQL 10 上

最佳答案

如评论中所述,最好指定参数。否则,您可以使用 row_to_json 提取单个记录元素并转换它们

CREATE OR REPLACE FUNCTION fun(anyelement)
RETURNS id_and_name AS $$
   SELECT (j->>'f1',j->>'f2')::id_and_name from row_to_json($1) as j;
$$ LANGUAGE sql;

DEMO

关于postgresql - 在 PostgreSQL 的 SQL 函数中将元素转换为用户定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55965233/

相关文章:

swift - 使函数能够处理不同的类作为参数

r - 将函数应用于向量中的每个元素组合

c++ - 如何从 C++ 管理 ghci?

c# - 试图将字符串解析为 DateTime 格式 "02/01/2010"dd/MM/yyyy 而不是 "1/2/2010 MM/dd/yyyy

inheritance - Haxe 反射 - 子类和接口(interface)

python - SQLAlchemy 中的 PostgreSQL 多维数组,不确定语法

ruby-on-rails - 如何计算 has_many 关联的所有子记录?

postgresql - 复合索引中列的顺序

Python:为什么这个数组是一个对象而不是 float ?

sql - 将逗号分隔的列数据拆分为其他列