功能:使用text / varchar参数作为查询

时间:2019-05-21 04:56:00

标签: postgresql

我有一个查询,可以在系统的不同部分中使用。现在,我想制作一个函数,其中它接受要用作查询的文本, 我什至不确定这是否可行。但是,我想知道是否有可能的解决方法。

我想要实现的是一个返回表并​​接受可用作查询的文本/ varchar的函数。

这就是我所拥有的,我有一个查询,它是一种“基础查询”,可以基于给定的CTE命名为不同的数据:

  

data_table

请参阅下面的函数及其用法-这主要是抽象的,但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');

1 个答案:

答案 0 :(得分:1)

除了传递查询外,您还可以传递表名并使用class MockClass : public BaseClass { public: MockClass(); MOCK_CONST_METHOD1(methodA, void(const typeA a)); MOCK_CONST_METHOD1(methodB, void(int b)); MOCK_CONST_METHOD3(methodC, bool(double c, double d, int e)); };

在查询中动态访问它。
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$;
相关问题