2011-09-28 259 views
1

我試圖根據鍵控搜索字符串檢索聯繫人名稱。它執行好了英文字母和奇怪的行爲對特殊字符,例如_,/,\,%PostgreSQL中搜索中的特殊字符

我在功能查詢類似於

SELECT contact_name FROM contacts WHERE LOWER(contact_name) LIKE LOWER('_McDonald%') ORDER BY LOWER(contact_name) ASC LIMIT 1; 

看起來,搜索時,它檢索所有聯繫人名稱而不是所需的。上述特殊字符會出現類似的奇怪現象。我需要支持這些。我如何教育postgres考慮這些字符?請指導我。

感謝和問候, Siva。

+1

如前所述,我們假設聯繫人:麥當勞,_麥當勞,__麥當勞,麥當勞,麥當勞,_麥當勞,麥克唐納德。我可能會搜索'_M%','%_%','%M%','M%'等。確保區分通配符字符'%'和普通特殊字符'%'。 – Siva

回答

1

只是爲了完成圖片:

您還可以使用ESCAPE子句指定的字符轉義通配符。如果您想要包含例如您的搜索字符串中有一個\

SELECT contact_name 
FROM contacts 
WHERE LOWER(contact_name) LIKE LOWER('@_McDonald%') ESCAPE '@' 
ORDER BY LOWER(contact_name) ASC 
LIMIT 1; 

順便說一句:我會建議打開配置選項standard_conforming_strings以避免混淆(黑斯的回答避免使用E'語法這個問題)。 從9.1開始,這是默認模式。

3

我不知道你正在使用的是什麼PostgreSQL版本,但是如果你想按照docs中描述的那樣直接匹配它們,請確保你轉義任何特殊字符(_,%,\,...)。

假設你想搜索與_McDonald啓動任何聯繫人姓名:

SELECT contact_name FROM contacts 
WHERE LOWER(contact_name) LIKE LOWER(E'\\_McDonald%') 
ORDER BY LOWER(contact_name) ASC LIMIT 1;