【问题标题】:How can I implement `set field = max(1, x)` in SQL?如何在 SQL 中实现 `set field = max(1, x)`?
【发布时间】:2011-08-24 18:31:58
【问题描述】:

我正在尝试使用一个表达式更新一系列记录中的一个字段,该表达式将计算为一个可能为负数的整数。我希望列的下限为 1;表达式计算结果小于 1 的任何行都应将其字段设置为 1。这可能最好通过以下一对伪 SQL 语句来表示:

update posts set field = [expensive expression];
update posts set field = 1 where field < 1;

如何在单个 SQL update 语句中实现这一点? PostgreSQL中是否有一些等效于max(a, b)的东西,我可以将max([expression], 1)传递给它?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

使用函数GREATEST

或者,更通用的条件方法:

SELECT 
     CASE WHEN condition 
     THEN valueForTrue
     ELSE valueForFalse
     END
FROM ...

【讨论】:

  • 我认为CASE 在这里一点都不好。这可能涉及重新计算昂贵的表达式。不能保证它在condition 中的外观和作为其中一个值的值将被优化掉;确实,我怀疑它会。
  • @Andrew 我说的是一种更通用的方法,不一定适合他的情况。如果您在 condition 中分配给变量,您也可以进行一次评估,但我不知道在 PostgreSQL 中是如何完成的(我是 MySQL 人)。
【解决方案2】:

是的,使用GREATEST([expensive expr], 1)

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2013-04-08
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      相关资源
      最近更新 更多