在全局表中存储WHERE子句

时间:2019-06-08 20:21:07

标签: sql postgresql

我正在运行该查询50次以上,并且我想抽象出下面的AND查询语句并将它们存储在一个/全局表中,所以将来如果我需要编辑一个表(相对于50个表)要编辑任何AND语句。将AND语句存储在单独的表中,然后在下面的查询中对其进行校准的最有效方法是什么?

SELECT  
    Field,
    Field2,
    Field3
    into table1
FROM    table2
WHERE (DESCRIPTION iLIKE '%ADVANCE%AUTO%Pa%')

AND is_duplicate!=1
AND amount >0 
AND currency_id = 152 
AND transaction_base_type = 'debit' 
AND TRANSACTION_STATUS <> 'D'

1 个答案:

答案 0 :(得分:3)

您可以创建一个视图/ materialized view

CREATE VIEW my_view
AS
SELECT  
    Field,
    Field2,
    Field3,
    DESCRIPTION
FROM    table2
WHERE  is_duplicate!=1
    AND amount >0 
    AND currency_id = 152 
    AND transaction_base_type = 'debit' 
    AND TRANSACTION_STATUS <> 'D'

然后:

SELECT Field, Field2, Field3
FROM my_view
WHERE (DESCRIPTION iLIKE '%ADVANCE%AUTO%Pa%')

编辑

  

我只需要将WHERE子句存储在一个地方,这样我就可以更新一次并在50个查询中调用它们,而不是在每个查询中都包含它们并更新50次。真的那么复杂吗?

正如我在评论中写道,您不能简单地参数化表名称(加上它可能表示schema is flawed)。 SQL是功能强大的语言,因此您可以使用dynamic SQL和函数。

CREATE OR REPLACE FUNCTION my_func(tab_name text)
RETURNS TABLE (
   id INT,     -- here goes common column list shared across all 50 tables
   col1 INT,
   col2 INT
 )
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN 
    RETURN QUERY 
    EXECUTE format('SELECT * from %I where col2 > 0',tab_name);
                                     -- here goes shared conditions
END 
$BODY$;

SELECT * FROM my_func('tab1');
SELECT * FROM my_func('tab2') WHERE col2 = 2;
                              -- condition that is not shared

db<>fiddle demo