2017-04-07 43 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

感謝您的幫助! –