首页 > 解决方案 > 如何使用作为参数传递给 plpgsql 函数的列名执行查询?

问题描述

我在 PostgreSQL 中有一个包含多列的表。我尝试让一个函数返回一个包含一些默认列和一个变量列的表。列名应作为函数参数传递。例子:

SELECT * FROM get_gas('temperature');

这是我现在的代码:

CREATE OR REPLACE FUNCTION get_gas(gas text) 
RETURNS TABLE (id INTEGER, node_id INTEGER, 
                  gas_name DOUBLE PRECISION, 
                  measurement_timestamp timestamp without time zone )
AS 
$$
BEGIN
  SELECT measurements_lora.id, measurements_lora.node_id, gas, measurements_lora.measurement_timestamp
  AS  measure
  FROM public.measurements_lora;
END
$$ LANGUAGE plpgsql; 

例如,当将“温度”作为列名 ( gas) 传递时,我想从函数调用中获取包含这些列的表。

id - node_id - temperature - measurement_timestamp

我将如何实现这一目标?

标签: postgresqlparameter-passingplpgsql

解决方案


你可以使用EXECUTE语句。

CREATE OR REPLACE FUNCTION get_gas(gas text) RETURNS TABLE (f1 INTEGER, f2 INTEGER, f3 DOUBLE PRECISION, f4 timestamp without time zone ) AS
    $$
        DECLARE
           sql_to_execute TEXT;
        BEGIN
            SELECT 'SELECT measurements_lora.id, 
                           measurements_lora.node_id, '
                           || gas ||',
                           measurements_lora.measurement_timestamp AS  measure
                      FROM public.measurements_lora ' 
              INTO sql_to_execute;
            RETURN QUERY EXECUTE sql_to_execute;
        END
    $$ LANGUAGE plpgsql; 

sql_to_execute这将使用您的字段和创建一个变量。QUERY EXECUTE将执行您的解释查询。

编辑1:查看有关安全问题的另一个答案。


推荐阅读