sql - 将结果选择为带有数组的类型
问题描述
创建了这样的类型:
create type type_student as (student_id numeric, first_name text, subjects text[]);
我正在尝试创建一个收集学生的函数:
create function collect_students() returns setof type_student
as $function$
declare
v_result type_student;
v_student RECORD
begin
for v_student in select id, first_name, (subject1, subject2, subject3) from students
loop
v_result := v_student;
return next v_result;
end loop;
end;
$function$ language plpgsql;
其中 id、first_name、subject1、subject2、subject3 是学生表中的列。
我收到与type_student类型中的主题值相关的转换错误。有没有办法在不单独分配数组的每个元素的情况下做到这一点?
解决方案
subjects
被声明为一个文本数组。您的 SELECT 返回一个记录类型列,而不是一个数组。
以下应该有效:
select id, first_name, array[subject1, subject2, subject3] from students
但是,您不需要类型,也不需要 FOR 循环,也不需要 PL/pgSQL:
create function collect_students()
returns table (student_id numeric, first_name text, subjects text[])
as $function$
select id, first_name, array[subject1, subject2, subject3]
from students
$function$
language sql;
如果您确实想使用 PL/pgSQL,您仍然不需要(慢)FOR 循环。一个简单的return query select ...;
就可以了。
推荐阅读
- c# - Excel求解器真的知道目标公式吗?
- c# - C# 没有给出与所需参数相对应的参数
- swift - 类型“X”没有“Y”的成员
- java - 重新创建二叉搜索树 BST
- python - 在相邻列中查找对值的有效方法(Python/R/Sql)
- r - 当 R 中只有数字时,删除空格并将值转换为数字
- javascript - React Router v6.0.0-alpha.5 历史道具删除 - 在反应上下文之外导航
- c++ - 适用于 macOS 的 Xcode 应用程序。这就是我设置从 USB 麦克风输入获取音频的方式。一年前工作,现在不行。为什么
- scala - 通过方法类型参数分配给类型成员的值破坏了类型等价性
- javascript - 本地状态值不能等于 redux 状态值