2016-04-06 9 views
0

Ich verwende diese:PreparedStatement funktioniert nicht für substring_index?

PreparedStatement preStatement = conn.prepareStatement("SELECT * FROM SomeTable WHERE attributeId = ? AND substring_index(substring_index(rowIdCombo,',',2),',',-1) = ?"); 

preStatement.setString(1, anAttributeID.toString()); 
preStatement.setString(2, locationID.toString()); 

Suche in die gleiche Abfrage arbeitet auf dem MySQL-Terminal in Ordnung. Nur wenn PreparedStatement in Java verwendet wird, ist dies nicht der Fall.

rowIdCombo ist im Grunde eine Folge von Zahlen mit durch Komma getrennten Werten. Etwas wie dieses: 23,56,64,3.

Die zurückgegebene Ergebnismenge ist leer. Wie bekomme ich diese Abfrage zu arbeiten?

+0

Ist es nicht einfacher, die rowIdCombo in Java aufzuteilen und eine sauberere PreparedStatement zu schreiben? Für Lesbarkeitsprobleme zumindest und auch einfacher zu debuggen. – JDDelgado

+0

Wenn ich 'substring_index' nicht verwende, gibt die Auswahl * 2 Millionen Zeilen zurück, was ein Problem sein wird, weil ich eine Datenbank auf einem Server abfrage. Ich brauche den Teilstring, der von SQL selbst gefunden wird, so dass nur die wenigen notwendigen Zeilen zurückgegeben werden. Auch, weil der SQL-Cursor nicht lange dauert, wenn eine große Anzahl von Zeilen zurückgegeben wird. – Nav

+0

Halten Sie an, rowIdCombo wird entsprechend Ihrem Code als der Literal rowIdCombo-String anstelle des tatsächlichen Werts (23,56,64,2) behandelt. – JDDelgado

Antwort

1

Basierend auf der Ausgabe von

System.out.println(preStatement); 

das war:

[email protected]: SELECT * FROM mydb.SomeTable WHERE attributeId = '6' AND substring_index(substring_index(rowIdCombo,',',2),',',-1) = '1'

und nach Ihrem Kommentar, dass = '1' mit = 1 gelöst haben ersetzt die Problem, um das Umbrechen der einfachen Anführungszeichen zu verhindern, setzen Sie den Wert in PreparedStatement als Ganzzahl, verwenden Sie dies:

preStatement.setInt(2, Integer.parseInt(locationID.toString())); 
+0

Die andere Lösung, die ich gerade gefunden habe, ist 'SELECT * FROM SomeTable WHERE attributId =? UND substring_index (substring_index (rowIdCombo, ',', 2), ',', - 1) =" + var + ";". Die Variable ist 'String var = num.toString();' – Nav

+0

ja, das wird auch funktionieren, aber wenn Ihr Code sollte kandidaten, also wenn Sie PreparedStatement verwenden müssen Sie es weiter verwenden :), und es ist sicherer als Verkettung – Yazan

+0

Mit Verkettung öffnen Sie Möglichkeiten zu [SQL-Injektion] (http://www.w3schools.com/sql/sql_injection.asp). –

Verwandte Themen