这是我遇到的一个简化问题。 我需要使用函数从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()和其他选项的加载失败......你能不能看看这个? 感谢。
答案 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;