sql - 在全局表中存储 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'
解决方案
您可以创建一个视图/物化视图:
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
推荐阅读
- r - ggplot2中的多个样条线 - 想要手动控制颜色
- javascript - 来自 FastAPI 的 400(错误请求)
- php - 根据每行的值选择其他行
- javascript - 为什么即使使用绑定我也会变得不确定?
- flutter - 未处理的异常:键入“列表”
' 不是类型转换中类型 'String' 的子类型 - flutter - Flutter dart问题-回调方法不返回变量的最新值
- python - Groovy 中是否有与 Python 的 yield 行为等价的行为?
- php - 空格 PHP 链接
- node.js - 如何从父项更新引用的子文档
- c# - 将 3 个标签控件的值添加到输出时出错,导致另一个标签控件