Java 通过在postgresql的where查询中传递%来筛选数据
我需要根据搜索框中的输入搜索数据。 为了处理这个问题,我编写了如下查询Java 通过在postgresql的where查询中传递%来筛选数据,java,postgresql,Java,Postgresql,我需要根据搜索框中的输入搜索数据。 为了处理这个问题,我编写了如下查询 SELECT distinct d.desktop_id as desktopId, d.name as desktopName from desktoptable where d.name ilike '%'+searchString+'%' searchString:nothing是我传递给查询的输入。这个查询在所有其他输入字符串(除了%和u)中都能正常工作,我在postgres文档中读
SELECT distinct d.desktop_id as desktopId,
d.name as desktopName
from desktoptable
where d.name
ilike '%'+searchString+'%'
searchString:nothing是我传递给查询的输入。这个查询在所有其他输入字符串(除了%和u)中都能正常工作,我在postgres文档中读到“u和%分别作为通配符表示任何单个字符和任何字符串”
这意味着我可以将%或uu作为输入传递给查询以过滤数据。在我的数据库中,有些记录也有%和u
有人能告诉我如何解决这个问题吗。很可能您的全局
ILIKE
搜索没有像Postgres上运行的实际SQL查询那样连接。出于这个原因,也为了避免SQL注入之类的事情,您应该在Java中使用准备好的语句。像这样的方法应该会奏效:
String query = "SELECT distinct d.desktop_id as desktopId, d.name as desktopName ";
query += "from desktoptable where d.name ilike ?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, "%" + handle(searchString) + "%");
这里的handle()
是一种方法,它将特别转义通配符和下划线,以便在LIKE
操作符中使用。AFAIK准备的语句不会自动执行此操作
public String handle (String input) {
return input.replaceAll("%", "\\%")
.replaceAll("_", "\\_");
}
我在Postgres上测试了这一点,一个反斜杠似乎就足以转义像特殊字符一样的
。你的建议是对的,但我想加上OP想要转义搜索字符串中的%.@YeWin我不这么认为,不是从我看到的。似乎他想进行通配符搜索,在这种情况下,%
不应以任何方式转义。因此,如果他在查询中输入像%\uu这样的参数,您的查询将被删除“我喜欢%aa%\uu%。因为他想将%或u作为输入传递给查询以筛选data@YeWin我现在明白你的意思了。我认为在这种情况下,我们需要手动转义通配符和下划线。很抱歉,如果有任何混淆,我在db中有一些记录具有特殊字符,如%、,$等。我的要求是获取名称中具有特殊字符%或u的所有桌面。我希望这能让问题变得不那么清楚