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

Jos*_*osh 5 sql oracle jdbc

WHERE为我的 sql动态生成子句时,我喜欢硬编码WHERE '1' = '1'到 sql 中,这样我就不必跟踪是否要添加AND到每个后续子句中。这在很多地方都有很好的记录,例如这个stackoverflow question

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

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

das*_*ght 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
Run Code Online (Sandbox Code Playgroud)

奇数索引处的参数是您传递的标志,用于指示必须设置相应的列。相应偶数索引处的参数是您想要设置的值,或者NULL如果您没有设置相应的字段。

这种方法使您需要传递的 JDBC 参数数量增加了一倍,但作为回报,您得到的语句中所有列的位置都是固定的,因此您可以准备和重用它,而不是动态构建它。