这个问题与Using query_to_xml in PostgreSQL with prepared statements非常相似,但是对于我来说,那里的解决方案似乎不起作用。这实际上是一个非常奇怪的情况。我有以下查询,它工作正常。
String sql = "select query_to_xml('select col1,col2,col3 FROM table where col4 = '||?||' and col5 = '||?||'', true,true,'');";
和准备好的声明,例如:
PreparedStatement ps0 = conn.prepareStatement(sql);
ps0.setInt(1, a);
ps0.setInt(2, b);
ResultSet rs0 = ps0.executeQuery();
但是,如果我向查询添加另一个字符串参数,则会引发错误。例如;
String sql = "select query_to_xml('select col1,col2,col3 FROM table where col4 = '||?||' and col5 = '||?||' and col6 = '||?||'', true,true,'');";
PreparedStatement ps0 = conn.prepareStatement(sql);
ps0.setInt(1, a);
ps0.setInt(2, b);
ps0.setString(3, c);
ResultSet rs0 = ps0.executeQuery();
引发以下错误:
org.postgresql.util.PSQLException: ERROR: column "percent" does not exist
我将字符串“ c”定义为“百分比”的位置。我认为这个问题实际上是因为它是我要传递给查询的字符串。我还尝试将%单词硬编码到我的where子句中,并且不将其作为参数包含在准备好的语句中,如下所示;
String sql = "select query_to_xml('select col1,col2,col3 FROM table where col4 = '||?||' and col5 = '||?||' and col6 = 'percent'', true,true,'');";
但这会产生以下错误;
org.postgresql.util.PSQLException: ERROR: syntax error at or near "percent"
我猜测解决方案可能是需要添加或删除的某个地方的单引号或双引号,但我似乎看不到它。
最佳答案
这是查询内部的查询。因此,它需要在引号内包含引号。为此,内部引号应加倍:
String sql = "select query_to_xml('select col1,col2,col3 FROM table where col4 = '||?||' and col5 = '||?||' and col6 = '''||?||'''', true,true,'');";
SQL文字
' and col6 = '''
在服务器端将被解释为and col6 = '
,而''''
将被解释为'
,因此在字符串的每一侧都有一个引号,即您需要什么才能告诉内部查询这是一个字符串。