动态生成时WHERE
我的 sql 子句,我喜欢硬编码 WHERE '1' = '1'
进入 sql,这样我就不必跟踪是否添加 AND
到每个以下条款。这在很多地方都有很好的记录,比如这个 stackoverflow question .
是否有动态生成 SET
的等效模式? UPDATE
的条款声明?我宁愿不跟踪是否需要在前面加上逗号。如果没有任何通用解决方案,这将用于通过 jdbc 与 oracle 数据库交互。
编辑
对于我的特定用例,我需要动态更改正在设置的列。因此,任何要求查询包含设置的所有列的解决方案都是行不通的。我们有一个包含 20 多列的表,但在任何给定时间只有 3 或 4 列会发生变化。我们运行了一些负载测试,发现满足性能目标的唯一方法是只发送需要更新的数据。现在我只是想写漂亮的代码来做到这一点。
最佳答案
为了附加逗号而避免跟踪列数的一种方法是始终分配所有可能的列,并传递一组控制变量来决定是否应分配列:
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 参数数量加倍,但作为返回,您会得到一个语句,其中所有列的位置都是固定的,因此您可以准备和重用它,而不是动态构建它。
关于sql - 更新相当于 WHERE '1' = '1',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37665646/