将列名传递给函数

exe*_*ook 3 sql postgresql stored-procedures

CREATE OR REPLACE FUNCTION test123(column_name VARCHAR(40)) RETURNS RECORD AS $$
DECLARE   
    rec RECORD ;
BEGIN
    SELECT * INTO rec FROM my_table WHERE column_name=1 LIMIT 1;
    RETURN rec;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

如何将列名传递给函数,然后在查询中使用该名称?

上面的代码不起作用:

error: operator does not exist: character varying = integer
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 5

当您想在函数内的查询中使用函数参数作为标识符时,您需要动态EXECUTE查询:

CREATE OR REPLACE FUNCTION test123(column_name VARCHAR(40)) RETURNS RECORD AS $$
DECLARE   
    rec RECORD;
BEGIN
    EXECUTE format('SELECT * FROM my_table WHERE %I = 1 LIMIT 1', column_name)
    INTO rec;
    RETURN rec;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

或更短:

CREATE OR REPLACE FUNCTION test123(column_name VARCHAR(40)) RETURNS RECORD AS $$
BEGIN
    RETURN QUERY EXECUTE format('SELECT * FROM my_table WHERE %I = 1 LIMIT 1', column_name);
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)