首页 > 解决方案 > 在全局表中存储 WHERE 子句

问题描述

我正在运行这个查询 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'

标签: sqlpostgresql

解决方案


您可以创建一个视图/物化视图

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 次。真的有那么复杂吗?

正如我在评论中所写,您不能简单地对表名进行参数化(另外它可能表明架构存在缺陷)。SQL 是一种强大的语言,因此您可以使用动态 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<>小提琴演示


推荐阅读