为什么我的LIKE语句失败并带有'\\ _'进行匹配?

时间:2017-04-07 17:43:48

标签: postgresql

我有一个数据库条目,其条目如下所示:

id | name | code_set_id

我有这个特殊的条目,我需要找到:

 674272310 | raphodo/qrc_resources.py |      782732

在我的rails应用程序(2.3.8)中,我有一个评估为:

的语句
SELECT * from fyles WHERE code_set_id = 782732 AND name LIKE 'raphodo/qrc\\_resources.py%';

从阅读转义中,上述查询是正确的。这应该正确地双重逃避下划线。但是,此查询未在数据库中找到该记录。这些查询将:

SELECT * from fyles WHERE code_set_id = 782732 AND name LIKE 'raphodo/qrc\_resources.py%';

SELECT * from fyles WHERE code_set_id = 782732 AND name LIKE 'raphodo/qrc_resources.py%';

我在这里遗漏了什么吗?为什么第一个SQL语句没有找到正确的条目?

1 个答案:

答案 0 :(得分:1)

LIKE escapes the following character的RHS中的单个反斜杠:

  

<强> 9.7.1。 LIKE
  [...]
  要匹配文字下划线或百分号而不匹配其他字符, pattern 中的相应字符必须以转义字符开头。默认转义字符是反斜杠,但可以使用ESCAPE子句选择不同的转义字符。要匹配转义字符本身,请写两个转义字符。

所以这是LIKE模式中的文字下划线:

\_

这是一个反斜杠后跟一个“任何字符”模式:

\\_

你想要LIKE看到这个:

raphodo/qrc\_resources.py%

PostgreSQL默认情况下用于解释字符串中的C-stye反斜杠转义但现在不得不使用E'...'在字符串文字中使用反斜杠转义(除非您更改了配置选项)。本手册的String Constants with C-style Escapes部分涵盖了这一点,但简单的版本就是这两个部分:

name LIKE E'raphodo/qrc\\_resources.py%'
name LIKE 'raphodo/qrc\_resources.py%'

做与PostgreSQL 9.1相同的事情。

据推测,你的Rails 2.3.8应用程序(或者正在准备你的LIKE模式的任何东西)假定PostgreSQL的旧版本比你实际使用的版本更早。你需要调整一些东西,不要把你的反斜杠加倍(或者用E s作为模式字符串文字的前缀。)