比如说,我有复合类型 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;
关于postgresql - 在 PostgreSQL 的 SQL 函数中将元素转换为用户定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55965233/