【发布时间】:2016-06-06 19:45:19
【问题描述】:
当为我的 sql 动态生成 WHERE 子句时,我喜欢将 WHERE '1' = '1' 硬编码到 sql 中,这样我就不必跟踪是否在每个后续子句前面加上 AND。这在很多地方都有很好的记录,例如stackoverflow question。
是否有等效的模式为UPDATE 语句动态生成SET 子句?我宁愿不跟踪是否需要在前面加上逗号。如果没有任何通用的解决方案,这将用于通过 jdbc 与 oracle 数据库进行交互。
编辑 对于我的特定用例,我需要动态更改正在设置的列。因此,任何要求查询包含所有正在设置的列的解决方案都是不可行的。我们有一个包含 20 多列的表,但在任何给定时间只有 3 或 4 列会发生变化。我们进行了一些负载测试,发现满足性能目标的唯一方法就是发送需要更新的数据。现在我只是想编写漂亮的代码来做到这一点。
【问题讨论】:
-
简短回答是否定的。就我个人而言,我讨厌“1=1”的东西,并且更喜欢编写更智能的逻辑,该逻辑知道是根据需要连接多少表达式来预先添加
,还是and。您可能想观察系统必须处理的解析负载 - 确保每次生成 SET 子句时列的顺序相同,以尽量减少这种情况。 -
这行得通:
DECLARE @dummy VARCHAR(1) = 'a'; UPDATE my_table SET @dummy = @dummy WHERE 1 = 1 AND my_second_column = 'My Second Value'。但是,这不是:DECLARE @dummy VARCHAR(1) = 'a'; UPDATE my_table SET my_first_column = 'My First Value', @dummy = @dummy WHERE 1 = 1 AND my_second_column = 'My Second Value'