避免在 postgres plpgsql 函数中几乎重复查询

Posted

技术标签:

【中文标题】避免在 postgres plpgsql 函数中几乎重复查询【英文标题】:Avoid almost duplicating query in postgres plpgsql function 【发布时间】:2019-03-24 16:25:03 【问题描述】:

有没有比几乎重复两次查询更好的方法在 plpgsql 函数中编写此查询?有什么办法可以说如果valB 为空,那么它应该匹配colB 中的任何内容,本质上是从 where 子句中删除?

if (valB is not null) then
    update mytable set colA = valA where (colB, colC) = (valB, valC);
else
    update mytable set colA = valA where (colC) = (valC);
end if;

【问题讨论】:

【参考方案1】:

您可以在参数中使用OR 条件:

update mytable 
   set colA = valA 
where (valb is null and colC = valC)
   or (valb is not null and (colb, colc) = (valb, valc));

【讨论】:

【参考方案2】:

您可以使用or。我将其表述为:

update mytable 
   set colA = valA 
where colC = valC and
       (valb is null or colb = valb);

【讨论】:

您是否会说您的建议和稍微修改它之间有任何实际区别,将(valb is null or colb = valb) 替换为(colb = case when valb is null then colb else valb end) 或者它们是否相同?另一种方式在性能或其他方面是否有任何缺点(除了阅读时间更长)? @user779159 。 . .我更喜欢将 case 表达式从 where 子句中删除。

以上是关于避免在 postgres plpgsql 函数中几乎重复查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgres/plpgsql 的视图定义中使用变量

在 postgres plpgsql 函数中重用 json 解析的输入

将数组从 node-postgres 传递给 plpgsql 函数

如何在不创建函数的情况下运行 plpgsql?

创建语法处或附近的 Plpgsql 函数错误

plpgsql 专家:(记录集)函数的输入和输出