通过参数postgresql返回列名

时间:2017-03-07 08:24:45

标签: arrays postgresql function parameters

这是我遇到的一个简化问题。 我需要使用函数从postgresql表中获取某些值并将参数传递给它。这是一个简化的表格和一些值:

CREATE TABLE  testFoo (
  id text NOT NULL,
  "type" text,
  value1 float,
  value2 float,
  value3 float
)
WITH (
  OIDS=FALSE
);

INSERT INTO testFoo (id, "type", value1, value2, value3)
VALUES (1, 'testValue1', '0.11', '0.22', '0.33');
INSERT INTO testFoo (id, "type", value1, value2, value3)
VALUES (1, 'testValue2', '0.00', '0.00', '0.00');

我需要能够根据'type'列内容获取值。 因此,例如,如果type ='testValue2',我需要获取'reading3'列的内容...如果它是'testValue1'那么我需要'read2'了... 这是我提出的一个功能:

DROP  FUNCTION getvalues(_values text[])
CREATE OR REPLACE FUNCTION getvalues(_values text[])
RETURNS TABLE (id text, type text, value float) AS
$BODY$ 
BEGIN
 EXECUTE 'SELECT t.id, t.type,
  CASE 
     WHEN t.type = '|| _values[1] ||' THEN '|| _values[2] ||'
  END AS value
FROM testFoo t';
END;
$BODY$
LANGUAGE plpgsql;

SELECT * FROM getvalues(ARRAY['testValue2','"reading3"']);

然而它给了我以下错误:

ERROR:  column "testvalue2" does not exist
LINE 3:      WHEN t.type = testValue2 THEN "reading3"
                           ^
QUERY:  SELECT t.id, t.type,
  CASE 
     WHEN t.type = testValue2 THEN "reading3"
  END AS value
FROM testFoo t
CONTEXT:  PL/pgSQL function getvalues(text[]) line 3 at EXECUTE
********** Error **********

ERROR: column "testvalue2" does not exist

我已经尝试过format()和其他选项的加载失败......你能不能看看这个? 感谢。

1 个答案:

答案 0 :(得分:2)

您应该使用format()函数和相应的格式说明符,特别是%I用于标识符(在本例中为列名)和%L用于需要引用的字符串文字。此外,您需要从函数返回实际数据。

CREATE OR REPLACE FUNCTION getvalues(_values text[])
RETURNS TABLE (id text, type text, value float) AS
$BODY$ 
BEGIN
  RETURN QUERY EXECUTE format('SELECT id, "type",
    CASE WHEN "type" = %L THEN %I
    END AS value
    FROM testFoo', _values[1], _values[2]);
END;
$BODY$
LANGUAGE plpgsql;