Postgresql 10 pl/pgsql 测试记录变量中是否存在列
Postgresql 10 pl/pgsql test if column exits in a RECORD variable
我有一个函数是这样开始的
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;
在 clean plpgsql 中是不可能的,因为没有任何 属性 用于动态访问记录(现在,将来可以更改)。但是你可以把record转成内置的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
我有一个函数是这样开始的
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;
在 clean plpgsql 中是不可能的,因为没有任何 属性 用于动态访问记录(现在,将来可以更改)。但是你可以把record转成内置的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