如何执行一个以列名作为参数传递给lpgsql函数的查询?

问题描述 投票:0回答:1

在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

我如何实现这个目标?

postgresql plpgsql pgadmin
1个回答
0
投票

你可以使用 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 将执行你的解释查询。

EDIT 1: 看看另一个答案,关于安全问题的关注。


0
投票

如果你真的需要动态SQL在PLpgSQL函数(你不),一定要防备 SQL注入! Like:

CREATE OR REPLACE FUNCTION get_gas(gas text)
  RETURNS TABLE (id integer
               , node_id integer 
               , gas_name double precision 
               , measurement_timestamp timestamp)
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY EXECUTE format(
   'SELECT m.id, m.node_id, m.%I, m.measurement_timestamp
    FROM   public.measurements_lora m'
  , gas
   );
END
$func$;

格式指定器 %Iformat() 必要时用双引号标识符。

请看

© www.soinside.com 2019 - 2024. All rights reserved.