【问题标题】:Retrieving a value from a RECORD从记录中检索值
【发布时间】:2012-10-18 15:27:56
【问题描述】:

在一个 plpgsql 函数中,我有一个记录类型的变量:

my_rec 记录;

此记录包含任意表中的一行,因此在执行之前我不知道列。 但是,我确实拥有至少一个可用作 varchar 的列的名称。

问题是:如何从 my_rec 中检索给定列的值?

【问题讨论】:

  • 您是否对给定的列尝试了一些 SELECT 语句?您不需要知道所有列来编写这样的语句。 (不确定是否适用,但从未使用过 RECORD)。

标签: postgresql plpgsql


【解决方案1】:

使用hstorerecords 一起使用PL/PgSQL 函数中的动态列:

CREATE EXTENSION hstore;

CREATE OR REPLACE FUNCTION test_fn(col_name text) RETURNS text AS $$
DECLARE 
  input_row record;
  col_value text;
BEGIN
  SELECT INTO input_row 
    * 
  FROM ( VALUES ('a','b','c',1) ) AS dummyrow(col1,col2,col3,intcol);

  SELECT INTO col_value
    hstore(input_row) -> col_name;

  RETURN col_value;
END;
$$ LANGUAGE 'plpgsql';

hstore 是一个扩展,但它是自 8.3 以来与 PostgreSQL 捆绑在一起的扩展,并且自 9.1 起就可以使用 CREATE EXTENSION 安装。从 8.4 或 9.0 之类的版本开始支持记录到 hstore 的转换。

【讨论】:

    【解决方案2】:

    我不知道在 plpgsql 中执行此操作的方法。我为您做了一些测试,并尝试使“EXECUTE SELECT”解决方案起作用,例如:

     EXECUTE 'select $1.' || quote_ident(the_param) USING my_rec INTO my_var;
    

    这对我不起作用,我得到:

     could not identify column "{{param_value here}}" in record data type
    

    Here 是几年前的一个非常相似的问题,说 plpgsql 不可能。根据它的建议,似乎应该可以使用其他一些语言。引用 Tom Lane 的回答:

    在 plpgsql 中没有办法做到这一点。你可以在其他 PL 中做到这一点 (例如 plperl、pltcl),因为它们的类型没有 plpgsql 强。

    【讨论】:

    • 不知道列名,函数调用时作为参数传入的。
    • 对不起...我被你的问题弄糊涂了。我以为您是在说您确实知道他们的专栏名称。我会相应地修改我的答案。
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多