Postgresql 10 plpgsql 测试列是不是存在于记录变量中
Posted
技术标签:
【中文标题】Postgresql 10 plpgsql 测试列是不是存在于记录变量中【英文标题】:Postgresql 10 pl/pgsql test if column exits in a RECORD variablePostgresql 10 plpgsql 测试列是否存在于记录变量中 【发布时间】:2021-03-08 02:48:54 【问题描述】:我有一个这样开始的函数
create or replace function dms_functions._enqueue_matter_property(ijob_id integer)
returns json
as $$
--
declare
irow record;
begin
select * from
public.netdocuments_matter_extract
where property_id = ijob_id
limit 1
into irow;
-- 现在处理 irow
public.netdocuments_matter_extract 是一个视图,可能会因 DMS 中的属性而异。
是否可以测试 irow 以查看列是否存在? 类似的东西
if exists(irow.parent_property) then
-- do something with the irow.parent_property
end if;
【问题讨论】:
【参考方案1】:在干净的 plpgsql 中是不可能的,因为没有任何属性可以动态访问记录(现在,将来可以更改)。但是你可以将记录转换为内置的jsonb类型,然后可以进行字段存在的测试:
do $$
declare
r record;
colname text = 'relnamex';
begin
select * from pg_class limit 1 into r;
if to_jsonb(r) ? colname then
raise notice 'record has column %', colname;
else
raise notice 'record has not column %', colname;
end if;
end;
$$;
NOTICE: record has not column relnamex
【讨论】:
以上是关于Postgresql 10 plpgsql 测试列是不是存在于记录变量中的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL - 继续 unique_violation (plpgsql)
Postgresql - 从 plpgsql 函数返回记录 []