PostgreSQL中搜索中的特殊字符

时间:2011-09-28 09:10:22

标签: sql postgresql

我正在尝试根据键控搜索字符串检索联系人姓名。它对英文字母表有好处,并且对于特殊字符(例如_,/,\,%

)表现得很奇怪

我在函数中的查询类似于

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

看起来,在搜索过程中,它会检索所有联系人姓名而不是所需的联系人姓名。对于上面提到的特殊字符,也会发生类似的奇怪现象。我需要支持这些。我如何教育postgres考虑这些字符?请指导我。

谢谢和问候, 希瓦。

3 个答案:

答案 0 :(得分:4)

我不知道你正在使用什么PostgreSQL版本,但如果你想按字面意思匹配它们,请确保你转义任何特殊字符(_,%,\,...){{3 }}

假设您要搜索以_McDonald开头的任何联系人姓名:

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

答案 1 :(得分:2)

只是为了完成图片:

您还可以使用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以避免混淆(Haes的回答通过使用E'语法避免了这个问题)。 从9.1开始,这是默认模式。

答案 2 :(得分:0)

您可以使用 double 反斜杠在字符串前的where子句中使用前缀E来转义以下字符:

WHERE LOWER(contact_name) LIKE LOWER(E'\\_McDonald%')

OR ,您可以执行以下附加的转义子句:

WHERE LOWER(contact_name) LIKE LOWER('@_McDonald%') ESCAPE '@'
  

请注意,前一种方法适用于LIKE,SIMILAR TO和NOT SIMILAR TO子句,但上述方法也适用于功能更强大的POSIX正则表达式,例如〜,〜,   !〜,!〜

docs中,您还可以看到一些可能有用的功能,例如regexp_replace,您可以在contact_name字段中尝试转义特殊字符:

SELECT 
regexp_replace(contact_name, '([!$()*+.:<=>?[\\\]^{|}-])', '\\\1', 'g') 
FROM 
contacts 
WHERE
LOWER(contact_name) LIKE LOWER('_McDonald%') 
ORDER BY 
LOWER(contact_name) ASC LIMIT 1;