2016-10-01 27 views
1

示例代码下调的最基本的要素来证明问题:如何获得PL/pgSQL的一个动态生成的字段名的值

CREATE OR REPLACE FUNCTION mytest4() RETURNS TEXT AS $$ 
DECLARE 
    wc_row wc_files%ROWTYPE; 
    fieldName TEXT; 
BEGIN 
    SELECT * INTO wc_row FROM wc_files WHERE "fileNumber" = 17117; 
-- RETURN wc_row."fileTitle"; -- This works. I get the contents of the field. 
    fieldName := 'fileTitle'; 
-- RETURN format('wc_row.%I',fieldName); -- This returns 'wc_row."fileTitle"' 
              -- but I need the value of it instead. 
    RETURN EXECUTE format('wc_row.%I',fieldName); -- This gives a syntax error. 
END; 
$$ LANGUAGE plpgsql; 

我怎样才能得到一个动态生成的字段名称中的价值这个情况?

+1

正确的方法使用'EXECUTE'声明中这样的病例:'执行格式使用wc_row( '选择$ 1%I',字段名)到结果;'然后'返回结果;'(可变'结果'应宣布) – Abelisto

+0

太棒了!我挣扎了好几个小时。谢谢!!! –

回答

1

使用技巧与功能to_json(),这对于一个复合类型返回与列名的JSON对象作为键:

create or replace function mytest4() 
returns text as $$ 
declare 
    wc_row wc_files; 
    fieldname text; 
begin 
    select * into wc_row from wc_files where "filenumber" = 17117; 
    fieldname := 'filetitle'; 
    return to_json(wc_row)->>fieldname; 
end; 
$$ language plpgsql; 
0

你不需要技巧。 EXECUTE做你所需要的,你已经在正确的轨道上。但RETURN EXECUTE ...是不合法的语法。

CREATE OR REPLACE FUNCTION mytest4(OUT my_col text) AS 
$func$ 
DECLARE 
    field_name text := 'fileTitle'; 
BEGIN 
    EXECUTE format('SELECT %I FROM wc_files WHERE "fileNumber" = 17117', field_name) 
    INTO my_col; -- data type coerced to text automatically. 
END 
$func$ LANGUAGE plpgsql;