小编典典

更新等效于WHERE'1'='1'

sql

WHERE为我的sql动态生成子句时,我喜欢将代码硬编码WHERE '1' = '1'到sql中,因此不必跟踪是否AND在每个后面的子句之前添加前缀。这在很多地方都有很好的文档证明,例如stackoverflow问题

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

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


阅读 190

收藏
2021-04-22

共1个答案

小编典典

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

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参数数量增加了一倍,但作为回报,您得到一条声明,其中所有列的位置都是固定的,因此您可以准备和重用它而不是动态构建它。

2021-04-22