【问题标题】:Avoid almost duplicating query in postgres plpgsql function避免在 postgres plpgsql 函数中几乎重复查询
【发布时间】: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;

【问题讨论】:

    标签: sql postgresql sql-update plpgsql


    【解决方案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 子句中删除。
      猜你喜欢
      • 2019-04-16
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      相关资源
      最近更新 更多