Sql 在全局表中存储WHERE子句
我正在运行这个查询50多次,我想抽象下面的and查询语句,并将它们存储在一个/全局表中,因此在将来,如果我想编辑任何and语句,我只需要编辑一个表(相对于50)。将AND语句存储在一个单独的表中,然后在下面的查询中调用它们,最有效的方法是什么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_
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