我想要一个字符串作为SQL“IN”子句的输入,其中我想要一个用逗号分隔的字符串列表
答案 0 :(得分:3)
答案 1 :(得分:2)
您应该使用PreparedStatement,以便在必要时自动转义您的字符串,并且您将受到sql注入的保护。
首先,为列表中的每个元素生成一个带有标记的语句。例如:
select id, name from users where name in (?, ?, ?)
然后循环遍历列表并在语句中设置值。
详细了解这个问题:
What is the best approach using JDBC for parameterizing an IN clause?
答案 2 :(得分:1)
这就是工作:
public String separateByComma(List<String> input) {
// check for valid input!!
public StringBuilder sb = new StringBuilder(input.get(0));
for (int i = 1; i < input.size(); i++)
sb.append(",").append(input.get(i));
return sb.toString();
}
BTW - 你可能需要用双引号括起来的字符串:
public String separateByCommaForSQL(List<String> input) {
// check for valid input!!
public StringBuilder sb = new StringBuilder("\""+input.get(0)+ "\"");
for (int i = 1; i < input.size(); i++)
sb.append(",\"").append(input.get(i)).append("\"");
return sb.toString();
}
答案 3 :(得分:0)
您可以使用org.apache.commons.lang.StringUtils.join()方法,或自己实施联接操作。
答案 4 :(得分:0)
正如其他答案所指出的那样,您可以使用许多帮助来进行加入。
我想补充一点:
请注意,大多数DBMS都可以像这样连接的值的数量上限。我们之前遇到过这种情况;如果你不确定你将永远不会超过几十个值,你必须确保不超过这个限制(每个DBMS都有所不同,有时甚至可以配置)。
限制通常来自SQL语句总大小的限制,或者以逗号分隔列表中值的显式限制。
如果遇到此问题,另一种方法是为值列表创建临时(或永久)表,并将INSERT
值放入此表中。然后,您可以使用WHERE xxx IN (SELECT column FROM helpertable)
而不是将列表放入SQL语句中。这避免了最大长度问题;如果您需要重新使用列表,它也可能更快。如果您只需要列表一次,那就更麻烦(也可能更慢)......
答案 5 :(得分:0)
一个不寻常的解决方案:如果字符串位于ArrayList
或LinkedList
(java.util.AbstractCollection
的子类),请致电toString()
,返回“ [e1,e2 ,e3 ......] “。然后你可以处理字符串。