首页 > 解决方案 > 功能:使用 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');

标签: postgresql

解决方案


您可以传递表名并在查询中使用动态访问它,而不是传递查询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');

推荐阅读