在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
我如何实现这个目标?
你可以使用 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: 看看另一个答案,关于安全问题的关注。
如果你真的需要动态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$;
格式指定器 %I
在 format()
必要时用双引号标识符。
请看