使用SQL有条件地更新列(在Oracle中)

时间:2014-02-12 12:19:00

标签: sql oracle

SQL中是否有办法有条件地使用一个或另一个值更新列?

我有这个更新sql(释义):

UPDATE LMPROC_LIMITS
   SET LIMIT = sign(LIMIT) * 100 * floor(0.000001 + (sign(LIMIT) * LIMIT * ratio/100)
 WHERE SYMBOL_ID = symbolId
   AND CLASSTYPE = LimitType
   AND TYPE_ IN (
                 'minClusterPosition', 
                 'maxClusterPosition',
                 'minProductPosition', 
                 'maxProductPosition', 
                 'minBookPosition',
                 'maxBookPosition', 
                 'maxShortShares'
                )

(比率,symbolId和LimitType都在运行时填写)

我想要做的是限制(没有双关语)LIMIT设置为+/- 2,147,483,647 - 即如果(符号(LIMIT)* 100 *楼层的结果(0.000001 +(符号(LIMIT)*) LIMIT * ratio / 100))或多或少,我想将其设置为+/- 2,147,483,647我可以在SQL中执行此操作吗?

这是在Oracle

1 个答案:

答案 0 :(得分:3)

您可以使用CASE声明:

update LMPROC_LIMITS
set LIMIT = 
  case 
    when sign(LIMIT) * 100 * floor(0.000001 + (sign(LIMIT) * LIMIT * ratio/100) > 2147483647 then 2147483647
    when sign(LIMIT) * 100 * floor(0.000001 + (sign(LIMIT) * LIMIT * ratio/100) < -2147483647 then - 2147483647
    else sign(LIMIT) * 100 * floor(0.000001 + (sign(LIMIT) * LIMIT * ratio/100)
  end       
where SYMBOL_ID = symbolId
and CLASSTYPE = LimitType
and TYPE_ in ('minClusterPosition', 'maxClusterPosition',
'minProductPosition', 'maxProductPosition', 'minBookPosition',
'maxBookPosition', 'maxShortShares')

同样在您的特定示例中,GREATEST和LEAST函数的组合也可以解决问题。