我正在运行该查询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'
答案 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