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

标签 sql oracle jdbc

动态生成时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/

相关文章:

sql - 如何将两个 float4 数组值相加到一个 Datum 数组中? (postgres 中的 c 函数)

oracle - 调整 sqoop 导出性能

c# - 连接到 Oracle 时出错,TNS :listener does not currently know of service requested in connect descriptor

java - CREATE TABLE 的 MySQL Errno 150(外键不正确)

java - 结果集开始之前

postgresql - "\d"jdbc 程序失败

SQL(Mysql)命令问题

sql - 使用 ssis 将表和表的一部分从一个数据库移动到另一个数据库

sql - 无法使用 RIGHT 函数创建计算列,因为 CHARINDEX 返回 null

java - SQL查询代码背后的逻辑来获取数据?