[英]JAVA Comma separated string to single quoted string
I'm trying to get the values from the user and using those values in my SQL query. 我试图从用户那里获取值,并在我的SQL查询中使用这些值。 I'm able to append the single values in my query but when I'm using IN in my query I'm facing problem. 我可以在查询中附加单个值,但是当我在查询中使用IN时,我遇到了问题。
I'm getting a string from user : po1,po2,po3
. 我从用户那里得到一个字符串: po1,po2,po3
。 I want to convert it into 'po1','po2','po3'
with least changes in the previous code. 我想将其转换为'po1','po2','po3'
,而对先前代码的更改最少。
I already handled adding brackets for IN but facing problem for adding single quotes. 我已经为IN添加括号,但是在添加单引号时遇到了问题。
Here's my whole code: 这是我的整个代码:
public static void main(String[] args) {
String poListString = "po1,po2,po3";
String query = "SELECT shpUID.attribute_value shipunitid, pal.container_id palletid, cas.container_id caseid, dl.delivery_line_id, dg.delivery_group_id, dlv.delivery_type_id, dl.qty, po.attribute_value po, Max(Isnull(comm.attribute_value, '')) commodity, Sum(Isnull(Cast(wgt.attribute_value AS FLOAT), 0.0)) weight, Max(Isnull(wgtuom.attribute_value, '')) weightuom, Sum(Isnull(Cast(vol.attribute_value AS FLOAT), 0.0)) volume, Max(Isnull(voluom.attribute_value, '')) volumeuom, GETDATE() EventDate FROM container pal INNER JOIN container cas ON pal.container_id = cas.parent_container_id AND pal.container_type = 'Pallet' AND cas.container_type = 'Case' INNER JOIN container_detail cdtl ON cdtl.container_id = cas.container_id INNER JOIN container_delivery cd ON cd.detail_id = cdtl.detail_id INNER JOIN delivery_line dl ON cd.delivery_line_id = dl.delivery_line_id INNER JOIN delivery_group dg ON dg.delivery_group_id = dl.delivery_group_id INNER JOIN delivery dlv ON dlv.delivery_num = dl.delivery_num INNER JOIN delivery_type dt ON dt.delivery_type_id = dlv.delivery_type_id LEFT OUTER JOIN attribute shpUID ON shpUID.attribute_id = cdtl.attribute_id AND shpUID.attribute_type = 'SHIP_UNIT_ID' LEFT OUTER JOIN attribute wgt ON wgt.attribute_id = cdtl.attribute_id AND wgt.attribute_type = 'Weight' LEFT OUTER JOIN attribute wgtuom ON wgtuom.attribute_id = cdtl.attribute_id AND wgtuom.attribute_type = 'Weightuom' LEFT OUTER JOIN attribute vol ON vol.attribute_id = cdtl.attribute_id AND vol.attribute_type = 'Volume' LEFT OUTER JOIN attribute voluom ON voluom.attribute_id = cdtl.attribute_id AND voluom.attribute_type = 'Volumeuom' LEFT OUTER JOIN attribute comm ON comm.attribute_id = cdtl.attribute_id AND comm.attribute_type = 'COMMODITY' LEFT OUTER JOIN attribute po ON po.attribute_id = cdtl.attribute_id AND po.attribute_type = 'PO' WHERE pal.container_id = @REPLACEMENT-1@ AND dlv.delivery_num IN @REPLACEMENT-IN@ AND dt.class = @REPLACEMENT-2@ GROUP BY pal.container_id, cas.container_id, dl.delivery_line_id, shpUID.attribute_value, po.attribute_value, pal.container_type, dg.delivery_group_id, dlv.delivery_type_id, dl.qty UNION SELECT shpUID.attribute_value shipunitid, pal.container_id palletid, 'UNKNOWN' caseid, dl.delivery_line_id, dg.delivery_group_id, dlv.delivery_type_id, dl.qty, po.attribute_value po, Max(Isnull(comm.attribute_value, '')) commodity, Sum(Isnull(Cast(wgt.attribute_value AS FLOAT), 0.0)) weight, Max(Isnull(wgtuom.attribute_value, '')) weightuom, Sum(Isnull(Cast(vol.attribute_value AS FLOAT), 0.0)) volume, Max(Isnull(voluom.attribute_value, '')) volumeuom, GETDATE() EventDate FROM container pal INNER JOIN container_detail cdtl ON cdtl.container_id = pal.container_id AND pal.container_type = 'Pallet' INNER JOIN container_delivery cd ON cd.detail_id = cdtl.detail_id INNER JOIN delivery_line dl ON cd.delivery_line_id = dl.delivery_line_id INNER JOIN delivery_group dg ON dg.delivery_group_id = dl.delivery_group_id INNER JOIN delivery dlv ON dlv.delivery_num = dl.delivery_num INNER JOIN delivery_type dt ON dt.delivery_type_id = dlv.delivery_type_id LEFT OUTER JOIN attribute shpUID ON shpUID.attribute_id = cdtl.attribute_id AND shpUID.attribute_type = 'SHIP_UNIT_ID' LEFT OUTER JOIN attribute wgt ON wgt.attribute_id = cdtl.attribute_id AND wgt.attribute_type = 'Weight' LEFT OUTER JOIN attribute wgtuom ON wgtuom.attribute_id = cdtl.attribute_id AND wgtuom.attribute_type = 'Weightuom' LEFT OUTER JOIN attribute vol ON vol.attribute_id = cdtl.attribute_id AND vol.attribute_type = 'Volume' LEFT OUTER JOIN attribute voluom ON voluom.attribute_id = cdtl.attribute_id AND voluom.attribute_type = 'Volumeuom' LEFT OUTER JOIN attribute comm ON comm.attribute_id = cdtl.attribute_id AND comm.attribute_type = 'COMMODITY' LEFT OUTER JOIN attribute po ON po.attribute_id = cdtl.attribute_id AND po.attribute_type = 'PO' WHERE pal.container_id = @REPLACEMENT-1@ AND dlv.delivery_num IN @REPLACEMENT-IN@ AND dt.class = @REPLACEMENT-2@ GROUP BY pal.container_id, dl.delivery_line_id, shpUID.attribute_value, po.attribute_value, pal.container_type, dg.delivery_group_id, dlv.delivery_type_id, dl.qty";
String value1 = "12345678910";
String value2 = "INBOUND";
String finalQuery = AppendQueryForIN.generateDynamicQueryForInAndValue(query, poListString, value1, value2);
System.out.println(finalQuery);
}
public static String generateDynamicQueryForInAndValue(String sqlQuery, String stringList, String value1, String value2)
{
StringBuilder listWithBrackets = new StringBuilder();
listWithBrackets = listWithBrackets.append('(').append(stringList).append(')');
String value1WithQoutes = "'"+value1+"'";
String value2WithQoutes = "'"+value2+"'";
String finalQuery = sqlQuery.replace("@REPLACEMENT-IN@", listWithBrackets);
finalQuery = finalQuery.replace("@REPLACEMENT-1@", value1WithQoutes);
finalQuery = finalQuery.replace("@REPLACEMENT-2@", value2WithQoutes);
return finalQuery;
}
Try using String.split
: 尝试使用String.split
:
String poListString = "po1,po2,po3";
String[] parts = poListString.split(",");
StringBuilder output = new StringBuilder();
for (String part : parts) {
if (output.length() > 0) {
output.append(",");
}
output.append("'").append(part).append("'");
}
System.out.println(output);
Output: 输出:
'po1','po2','po3'
Assuming that string format doesn't change, you can use regex
to replace comma and start and end of the string 假设字符串格式没有变化, regex
可以使用regex
替换逗号以及字符串的开头和结尾
For example: 例如:
String poListString = "po1,po2,po3";
String result=poListString.replaceAll("^|$", "'").replaceAll(",", "','");
//first replaceAll, adds ' to start and end and second replace change , to ','
System.out.println(results);
OUTPUT: 输出:
'po1','po2','po3' 'po1','po2','po3'
Just for sharing the idea by using a Stream
. 仅用于使用Stream
分享想法。
String quoted = Pattern.compile(",").splitAsStream(poListString)
.collect(Collectors.joining("','", "'", "'"));
By storing the Pattern
as a constant in your class and using static import: 通过将Pattern
作为常量存储在类中并使用静态导入:
String quoted = PATTERN.splitAsStream(poListString).collect(joining("','", "'", "'"));
public static String generateDynamicQueryForInAndValue(String sqlQuery, String stringList, String value1, String value2)
{
StringBuilder listWithBrackets = new StringBuilder();
if(stringList == null || stringList.isEmpty()){
stringList = "''";
}else{
stringList=stringList.replaceAll("^|$", "'").replaceAll(",", "','");
}
listWithBrackets = listWithBrackets.append('(').append(stringList).append(')');
String value1WithQoutes = "'"+value1+"'";
String value2WithQoutes = "'"+value2+"'";
String finalQuery = sqlQuery.replace("@REPLACEMENT-IN@", listWithBrackets);
finalQuery = finalQuery.replace("@REPLACEMENT-1@", value1WithQoutes);
finalQuery = finalQuery.replace("@REPLACEMENT-2@", value2WithQoutes);
return finalQuery;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.