为我的sql动态生成WHERE
子句时,我喜欢将WHERE '1' = '1'
硬编码到sql中,因此我不必跟踪是否在每个后续子句中加上AND
。许多地方都有详细记录,例如stackoverflow question。
是否有动态生成SET
语句的UPDATE
子句的等效模式?我宁愿不跟踪是否需要在逗号之前添加逗号。如果没有任何通用解决方案,这将通过jdbc与oracle数据库进行交互。
EDIT 对于我的特定用例,我需要动态更改正在设置的列。因此,任何需要查询包含所有列的解决方案都是不行的。我们有一个包含20多列的表格,但在任何给定时间只有3或4列会发生变化。我们运行了一些负载测试,发现实现性能目标的唯一方法就是发送需要更新的数据。现在我只是想编写漂亮的代码来做到这一点。
答案 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;的更新,如运行触发器。