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

时间:2019-06-27 15:33:46

标签: sql postgresql plpgsql

我想通过在PL / SQL函数中通过文本变量传递的名称访问对象的字段/属性。例如,代替:

obj.fieldA

我想做类似的事情:

obj['fieldA']

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

1 个答案:

答案 0 :(得分:1)

我知道,编译语言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 ($1).%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是最舒适的方法。