1

Here's a simplified problem I have. I need to get certain values from a postgresql table using a function and passing parameters to it. Here's a simplified table and some values:

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');

I need to be able to fetch the values based on the 'type' column content. So for instance if the type = 'testValue2' I need to get to content of 'reading3' column... if it is 'testValue1' then I need 'reading2' out... Here's a function I came up:

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"']);

However it gives me the follwoing error:

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

I've tried format() and loads of other options unsuccessfully... Could you kindly look in this? Thanks.

1 Answer 1

2

You should use the format() function with the appropriate format specifiers, in particular %I for identifiers (column name, in this case) and %L for string literals that need quoting. Also, you need to return the actual data from the function.

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;
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.