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