Sql 在全局表中存储WHERE子句

Sql 在全局表中存储WHERE子句,sql,postgresql,Sql,Postgresql,我正在运行这个查询50多次,我想抽象下面的and查询语句,并将它们存储在一个/全局表中,因此在将来,如果我想编辑任何and语句,我只需要编辑一个表(相对于50)。将AND语句存储在一个单独的表中,然后在下面的查询中调用它们,最有效的方法是什么 SELECT Field, Field2, Field3 into table1 FROM table2 WHERE (DESCRIPTION iLIKE '%ADVANCE%AUTO%Pa%') AND is_

我正在运行这个查询50多次,我想抽象下面的and查询语句,并将它们存储在一个/全局表中,因此在将来,如果我想编辑任何and语句,我只需要编辑一个表(相对于50)。将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'
选择
领域
字段2,
字段3
进入表1
来自表2
其中(说明类似于“%ADVANCE%AUTO%Pa%”)
而且是重复的=1.
和数量>0
货币_id=152
和交易\基本\类型='借方'
和事务_状态“D”
您可以创建一个视图/:


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

正如我在注释中所写的,您不能简单地参数化表名(加上它可能表明)。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

是否有一种方法可以编辑仅包含AND语句的视图?是否有办法避免在最终查询(即带有WHERE(如“%ADVANCE%AUTO%Pa%”的描述)之前查询表2@ZJAY是的,如果需要,您可以更改视图。然后你只询问我的观点谢谢@Lukasz Szozda。我可以只使用AND语句编写视图,而不使用查询吗?我不想在视图中编写任何查询,只需要在其他50个查询中访问WHERE语句的条件。这可能吗?@Lukasz Szozda这不是正确的解决方案,因为我只能对表2运行我的_视图。但关键是创建一个全局查询,我可以在50个不同的表上运行,但必要时只需在一个地方编辑WHERE子句。
“创建一个全局查询,我可以在50个不同的表上运行”
,然后您需要。不能简单地参数化表名。如果你有相同的where条件,看起来你的设计有缺陷()
SELECT Field, Field2, Field3
FROM my_view
WHERE (DESCRIPTION iLIKE '%ADVANCE%AUTO%Pa%')
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