Я хотел бы создать JDBC PreparedStatement, как:Как избежать буквального знак вопроса («?») В JDBC подготовил заявление
SELECT URL,LOCATE ('?', URL) pos FROM Links WHERE pageId=? ORDER BY pos ASC
Если первый ?
является буквальным и второй ?
является параметром. Я мог бы использовать CHAR(63)
вместо '?'
, но я думаю, что дополнительный вызов функции замедлит выполнение SQL. Есть ли способ избежать этого первого ?
?
Edit:
утверждение Следующий код пробы Популярность dkatzel о том, что ?
символ в строке не считается маркером:
public class Test {
public static void main(String[] args) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:h2:mem:test");
Statement stmt = conn.createStatement();
stmt.executeUpdate("CREATE TABLE Links(URL VARCHAR(255) PRIMARY KEY,pageId BIGINT)");
stmt.executeUpdate("INSERT INTO Links(URL,pageId) VALUES('http://foo.bar?baz',1)");
stmt.executeUpdate("INSERT INTO Links(URL,pageId) VALUES('http://foo.bar/baz',1)");
stmt.close();
PreparedStatement ps = conn
.prepareStatement("SELECT URL,LOCATE ('?', URL) pos FROM Links WHERE pageId=? ORDER BY pos ASC");
ps.setLong(1, 1);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1) + ":" + rs.getInt(2));
}
rs.close();
ps.close();
conn.close();
}
}
Выход:
http://foo.bar/baz:0
http://foo.bar?baz:15
Оказывается, что dkatzel верно. Я искал JDBC Spec и не мог найти упоминания о том, что маркер параметра ?
будет проигнорирован, если он находится в кавычках, но несколько реализаций парсеров PreparedStatement, которые я нашел (MySql, c-JDBC,), все, кажется, исключают текст в одинарных кавычках из рассмотрение как маркеры параметров.
Возможный дубликат [Является ли спецификация JDBC «запрещена»? от использования в качестве оператора (вне кавычек)?] (http://stackoverflow.com/questions/14779896/does-the-jdbc-spec-prevent-from-being-used-as-an-operator-outside- из-кавычек) –
Предлагаемый дубликат, http://stackoverflow.com/questions/14779896/does-the-jdbc-spec-prevent-from-being-used-as-an-operator-outside-of-quotes специально делает не задайте вопрос о параметре маркера параметра?? в кавычках (задан здесь). –