反斜杠在LIKE子句中工作不正确

时间:2015-05-18 03:47:44

标签: sql postgresql jpa jpql

我要使用LIKE和反斜杠来搜索某些名称。问题是Postgres将反斜杠理解为LIKE子句中的转义字符。我试图启用standard_conforming_strings,但它没有帮助。

SELECT h.software_id
    ,h.software_name
FROM software h
WHERE software_name LIKE '%\%';

此查询没有显示任何内容,而我有一个软件名称' \'。

我听到有人提到prepared statement。我使用Hibernate来执行上述查询。

     <persistence-unit name="policyPersistence" transaction-type="JTA">
      <jta-data-source>java:jboss/datasources/MyApp</jta-data-source>
      <properties>
         <property name="hibernate.hbm2ddl.auto" value="validate" />
         <property name="hibernate.show_sql" value="false" />
         <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
         <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
      </properties>
   </persistence-unit>

JPA

query.setParameter(1, "%" + searchCriteria.getSoftwareName() + "%");

但Postgres并没有正确地逃避反斜杠。

如何解决?

2 个答案:

答案 0 :(得分:4)

与常规字符串文字不同,反斜杠确实充当转义字符,更改standard_conforming_strings不会改变这一点。

为了能够使用%搜索_LIKE,您可以escape子句:where x like '%#_' escape '#'定义字符{ {1}}作为类似条件的转义字符。转义字符后面的任何字符都不会被解释为通配符。因此,#会使用下划线搜索 end 的值。

反斜杠是默认的转义字符,因此不指定like '%#_' escape '#'子句与指定escape相同(此行为由SQL标准定义)。

所以你需要使用:

escape '\'

防止Postgres使用select * from stuff.foo where software_name like '%\%' escape '#' 作为转义字符。唯一的另一种方法是使用\来逃避反斜杠(注意:这里只有两个反斜杠,而不是TimoSta建议的四个反斜杠)。

以下是Postgres手册的链接:
http://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE

答案 1 :(得分:2)

这应该有效:

SELECT h.software_id,
       h.software_name
FROM software h
WHERE software_name LIKE '%\\\\%';

反斜杠是SQL的LIKE子句和一般字符串的转义前缀,因此是双重转义。