如何将字符串数组动态传递给Java中的SQL“IN”子句? [复制]

Posted

技术标签:

【中文标题】如何将字符串数组动态传递给Java中的SQL“IN”子句? [复制]【英文标题】:How to pass array of strings dynamically to SQL "IN" clause in Java? [duplicate] 【发布时间】:2013-12-15 05:43:57 【问题描述】:

我有一个包含特定值的字符串数组“String[]”。我想将该数组动态传递给 SQL“IN”子句,例如:

Select * from Employee where emp_name in (?);

这里“?”必须用字符串数组替换。我想在 Java 类中做到这一点。我试过了

Array array = conn.createArrayOf("VARCHAR", new Object[]"1", "2","3");
pstmt.setArray(1, array);

但它不起作用并出现异常“SQLFeatureException”。

谢谢!!!

【问题讨论】:

另见PreparedStatement with list of parameters in a IN clause,其中链接了很多骗子。 【参考方案1】:

您可以通过使用 StringBuilder 迭代字符串数组来创建带有 IN 子句的查询。

我建议不要使用Arrays.toString() 的复杂性,除非你真的需要它。性能不会有太大差异,因为两者都需要迭代数组以创建 String 文字。

在我的方法中,我们可以很好地控制数组的迭代,添加单引号逗号等。

【讨论】:

上述解决方案有效。我只想避免该循环,并希望将“ABC”、“DFD”、“ss”等字符串传递给“?” ..这可能吗【参考方案2】:

我们可以应用选择批处理来解决您的问题。参考:

link

【讨论】:

仅链接答案无效:)【参考方案3】:

基本上,字段 emp_name 不是一个数组,而是一个 VARCHAR,因此当您为其设置值时,它必须是一个字符串。因此,查询中只有 1 个? 表示 emp_name 的单个可能值。您必须列出与数组长度一样多的?,并用它们的值单独替换它们。

假设 empNames 是 String[],您可以这样做来准备查询:

StringBuilder query = new StringBuilder("Select * from Employee where emp_name in (");
for (int i = 0; i < empNames.length; i++) 
  if (i > 0) 
    query.append(",");
  
  query.append("?");

query.append(")");

这用于设置? 后面的各个值:

for (int i = 0; i < empNames.length; i++) 
  pstmt.setString(i+1, empNames[i]);

【讨论】:

以上是关于如何将字符串数组动态传递给Java中的SQL“IN”子句? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将多维动态数组传递给C++中的函数

将列表传递给 HQL 或 SQL 中的 IN 子句?

IN() 子句 oracle PLSQL 中的数组

我们如何将数组从java传递到oracle中的存储过程

SQL Server (2008) 将 ArrayList 或字符串传递给 SP 用于 IN()

如何将Mac地址转换为十六进制并将其传递给java中的字节数组