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 中使用 plpgsql 有啥好处

Postgresql plpgsql 多行循环

PostgreSQL - 继续 unique_violation (plpgsql)

Postgresql - 从 plpgsql 函数返回记录 []

如何在 PostgreSQL 9.2 中分析 plpgsql 函数

在 plpgsql(PostgreSQL 的)中,可以将 CTE 保留到外循环吗?