在 jdbc 中使用 where in 子句

Posted

技术标签:

【中文标题】在 jdbc 中使用 where in 子句【英文标题】:making use of where in clause in jdbc 【发布时间】:2013-06-13 17:47:12 【问题描述】:

我从 UI 中获取了一堆数字(只有整数值)并将其传递给后端。 例如,这些数字以“num1,num2,..,numN”格式的字符串形式出现

"145,78,934"

数据库表中对应的字段是Decimal(8),我想做的是

update myawesomeTable set moreAwesomeField = 'YES' where criteriaField in (145,78,938)

我目前正在做的事情很蹩脚而且很慢。(如下所示)

pstm.preparedStatement("update myawesomeTable set moreAwesomeField='YES' where criteriaField = ?")

通过一个 for 循环,我通过一个接一个地获取条件字段值的子字符串并执行来更新条件字段

pstm.setBigDecimal(new BigDecimal(criStr[i]));

那么我现在有什么选择?我正在使用 Db2 9.5+(和 java 1.4-)我无法以任何其他格式获取标准字段,我尝试了“在哪里”preparedStatement,但没有任何运气。我希望这个查询一次性执行。

【问题讨论】:

【参考方案1】:

你有两个选择。

1) 使用文字值动态组合语句字符串:

pstm.preparedStatement(
 "update myawesomeTable set moreAwesomeField='YES' where criteriaField in ("
 + yourVariableContainingTheListOfNumbers 
 + ")"
)

这很简单,但会让您接触到SQL injection

2) 使用参数标记动态组合语句:计算列表中有多少值,例如3;使用适当数量的参数标记组成语句,使其看起来像update myawesomeTable set moreAwesomeField='YES' where criteriaField in (?, ?, ?),然后将各个值绑定到参数标记。

后一个选项的变体,如果您可以保证列表长度具有上限,例如不超过 10 个值,将使用具有最大参数标记数的参数化语句字符串,并将空值绑定到没有参数的标记。

【讨论】:

第一个在 db2 jdbc 中是不允许的(说转换格式无效),我天真地尝试过。第二个似乎更好,但仍然必须明确填写 pstmt,虽然我只打了一次 db,所以更好。我会试试看。 "第一个在 db2 jdbc 中是不允许的"——以前从未见过。我猜它可能期待参数标记。然后你只需在字符串上使用 executeUpdate(),因为没有什么需要准备的。 @mustaccio 我猜criteriaField 是一个基于字符的字段,但列表中的值没有被引号包围。即where criteriaField in ('145','78','934') @Ian Bjorhovde:“列表中的值没有被引号括起来”。这是一个问题,为什么?由于比较的是十进制列,所以数字文字应该没问题,不是吗?

以上是关于在 jdbc 中使用 where in 子句的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 PySpark 的 WHERE 子句在 AWS Glue 中查询 JDBC 数据库?

在 where 子句中使用解码,并带有“in”

在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?

在“where”子句中使用“in”运算符更新行

在 WHERE IN 子句中使用 JSONB 数组中的值

SQL 在 WHERE IN 子句中使用 CASE 语句