按名称访问 PL/pgSQL 对象中的对象字段

Accessing object fields by name in PL/pgSQL object

我想通过 PL/SQL 函数中的文本变量传入的名称访问对象的 fields/properties。例如,而不是:

obj.fieldA

我想做这样的事情:

obj['fieldA']

有没有办法在 PL/SQL 中完成此操作?我正在使用 Postgres,所以也许我应该说 PL/pgSQL,但我希望存在通用语法。

据我所知,编译语言PL/SQL不允许。通常这是动态语言的一个特性。 PLpgSQL 也不支持此功能,但有一些解决方法:

  • 动态SQL

    CREATE TABLE foo(a int, b varchar, c date);
    INSERT INTO foo VALUES(10, 'Hello', CURRENT_DATE);
    
    DO $$
    DECLARE 
      foo_rec foo%ROWTYPE;
      colname text DEFAULT 'b';
      value text;
    BEGIN
      SELECT * FROM foo INTO foo_rec;
      EXECUTE format('SELECT ().%I::text', colname) INTO value USING foo_rec;
      RAISE NOTICE '% = %', colname, value;
    END;
    $$;
    
  • 转换为 JSON 并从 JSON 中读取值

    DO $$
    DECLARE 
      foo_rec foo%ROWTYPE;
      colname text DEFAULT 'b';
      j json;
    BEGIN
      SELECT * FROM foo INTO foo_rec;
      j := row_to_json(foo_rec);
      RAISE NOTICE '% = %', colname, j->>colname;
    END;
    $$;
    

今天使用JSON是最舒服的方式。