postgresql - 功能:使用 text/varchar 参数作为查询
问题描述
我有一个在系统的不同部分使用的查询。现在我想做一个函数,它接受一个文本作为查询,我什至不确定这是否可能。但是,我想知道是否有可能的解决方法。
我想要实现的是一个返回表并接受可用作查询的文本/varchar 的函数。
这就是我所拥有的,我有一个类似于“基本查询”的查询,它可以根据给定的 CTE 具有不同的数据,该 CTE 名为:
数据表
请参阅下面的函数及其用法 - 这主要是抽象的,但 imo 这应该足够了。
CREATE OR REPLACE FUNCTION func(
data_query TEXT
)
RETURNS TABLE
(
id BIGINT,
random_text varchar
)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
with data_table AS (
data_query
), another_data_table AS (
SELECT
*
FROM my_data
)
SELECT
d.id,
ad.random_text
FROM data_table d
INNER JOIN another_data_table ad
ON ad.ref_id = d.id;
END; $function$;
用法:
SELECT * FROM func('SELECT * FROM my_data_table');
SELECT * FROM func('SELECT * FROM my_second_data_table');
解决方案
您可以传递表名并在查询中使用动态访问它,而不是传递查询EXECUTE format
CREATE OR REPLACE FUNCTION func(
table_name_in TEXT
)
RETURNS TABLE
(
id BIGINT,
random_text varchar
)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY EXECUTE format (
'SELECT
d.id :: bigint,
ad.random_text :: varchar
FROM %I d
INNER JOIN my_data ad
ON ad.ref_id = d.id', table_name_in );
END
$function$;
用法:
SELECT * FROM func('my_data_table');
SELECT * FROM func('my_second_data_table');
推荐阅读
- kubernetes - Minikube 错误指出未找到绑定的 pvc
- javascript - 每次从指定索引单击时从另一个数组复制一个数组
- python - 为什么 VS Code IntelliSense for Python 不建议所有相同类型的变量自动完成?
- javascript - 有没有办法将 Sequelize 与 IndexedDB 等客户端存储一起使用?
- r - R:如何识别数据框中所有组的最小值的索引
- javascript - 为什么 div circle 没有出现在 DOM 样式操作中?
- rust - Rust Arrayfire 闭包乘法
- python - 从带有文本的csv文件到带有python的字典
- python - int 的随机数学方程
- javascript - Vue JS:方法样式获取器(过滤)和对状态变化的反应