2017-04-07 81 views
0

我有了看起来像这样的条目的数据库条目:为什么我的LIKE语句与'\ _'匹配失败?

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

根据[文档](https://www.postgresql.org/docs/current/static/functions-matching.html):'要匹配文字下划线或百分号而不匹配其他字符,则相应的字符在模式中必须以转义字符开头。“是什么让你相信你应该加倍反斜杠?另外,没有任何反斜杠的查询会匹配太多的字符串,因为'_'代表'任何字符'。 – Marth

+1

@地球它比这更复杂一点。 PostgreSQL支持标准的字符串和E字符串,后者支持C风格的反斜杠,并且曾经是默认的,但是在PostgreSQL 9.1中进行了修改。 –

回答

1

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

9.7.1。 LIKE
[...]
要匹配文字的下划线或者百分号不必须由转义字符的前面在图案匹配其他字符,各字符。默认转义字符是反斜杠,但可以使用ESCAPE子句选择不同的转义字符。为了匹配转义字符本身,编写两个转义字符。

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

\_ 

,这是一个单反斜线后跟一个“任何字符”的格局:

\\_ 

你要喜欢看到这个:

raphodo/qrc\_resources.py% 

PostgreSQL用来int erpret默认情况下,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之前加上模式字符串的前缀)。

+0

感谢您的帮助! –

相关问题