更新相当于WHERE'1'='1'

时间:2016-06-06 19:45:20

标签: sql oracle jdbc

为我的sql动态生成WHERE子句时,我喜欢将WHERE '1' = '1'硬编码到sql中,因此我不必跟踪是否在每个后续子句中加上AND。许多地方都有详细记录,例如stackoverflow question

是否有动态生成SET语句的UPDATE子句的等效模式?我宁愿不跟踪是否需要在逗号之前添加逗号。如果没有任何通用解决方案,这将通过jdbc与oracle数据库进行交互。

EDIT 对于我的特定用例,我需要动态更改正在设置的列。因此,任何需要查询包含所有列的解决方案都是不行的。我们有一个包含20多列的表格,但在任何给定时间只有3或4列会发生变化。我们运行了一些负载测试,发现实现性能目标的唯一方法就是发送需要更新的数据。现在我只是想编写漂亮的代码来做到这一点。

2 个答案:

答案 0 :(得分:2)

为了追加逗号而避免跟踪列数的一种方法是始终分配所有可能的列,并传递一组控制变量来决定是否应该分配列:

UPDATE MyTable
SET
    col1 = CASE ? WHEN 1 THEN ? ELSE col1 END
,   col2 = CASE ? WHEN 1 THEN ? ELSE col2 END
,   col3 = CASE ? WHEN 1 THEN ? ELSE col3 END
WHERE
    ... -- condition goes here

奇数索引处的参数是您传递的标志,表示必须设置相应的列。相应偶数索引处的参数是您要设置的值,如果您没有设置相应的字段,则为NULL

这种方法使您需要传递的JDBC参数的数量翻倍,但作为回报,您会得到一个声明,其中所有列的位置都是固定的,因此您可以准备并重用它而不是动态构建它。

答案 1 :(得分:1)

首先,如果没有改变,最好不要执行查询。

但是如果你不得不这样做,或者以其他方式做得更贵,你通常可以这样做:

UPDATE 
  MY_TABLE
SET
  <if test="xx">  COL1='VAL1',</if>
  ID=ID
where 1=1
  COL1 like 'VAL%';

ID=ID充当noop。

请记住,这仍将执行所有&#34;副作用&#34;的更新,如运行触发器。