Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL中搜索的特殊字符_Sql_Postgresql - Fatal编程技术网

PostgreSQL中搜索的特殊字符

PostgreSQL中搜索的特殊字符,sql,postgresql,Sql,Postgresql,我正在尝试根据键入的搜索字符串检索联系人姓名。它在英文字母表中表现良好,在特殊字符(如,/,\,%)中表现异常 我在函数中的查询类似于 SELECT contact_name FROM contacts WHERE LOWER(contact_name) LIKE LOWER('_McDonald%') ORDER BY LOWER(contact_name) ASC LIMIT 1; 看起来,在搜索过程中,它会检索所有联系人的姓名,而不是所需的姓名。类似的奇怪现象也发生在上述特殊角色身上。我

我正在尝试根据键入的搜索字符串检索联系人姓名。它在英文字母表中表现良好,在特殊字符(如,/,\,%)中表现异常

我在函数中的查询类似于

SELECT contact_name FROM contacts WHERE LOWER(contact_name) LIKE LOWER('_McDonald%') ORDER BY LOWER(contact_name) ASC LIMIT 1;
看起来,在搜索过程中,它会检索所有联系人的姓名,而不是所需的姓名。类似的奇怪现象也发生在上述特殊角色身上。我需要支持这些。我如何教育PiggRs考虑这些字符?请引导我

感谢和问候,
Siva.

我不知道您使用的是什么PostgreSQL版本,但如果您想按照中的描述逐字匹配任何特殊字符(u、%、\、…),请确保转义它们

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

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

为了完成这幅图:

还可以使用ESCAPE子句指定用于转义通配符的字符。如果您希望在搜索字符串中包含例如
\
,此选项非常有用

SELECT contact_name 
FROM contacts 
WHERE LOWER(contact_name) LIKE LOWER('@_McDonald%') ESCAPE '@'
ORDER BY LOWER(contact_name) ASC 
LIMIT 1;
顺便说一句:我建议打开配置选项以避免混淆(Haes的回答通过使用
E'
语法避免了这个问题)。
从9.1开始,这是默认模式

可以在字符串前面的where子句中使用带前缀的E,并使用双反斜杠转义以下字符:

WHERE LOWER(contact_name) LIKE LOWER(E'\\_McDonald%')
或者,您可以按照以下方式执行附加的免责条款:

WHERE LOWER(contact_name) LIKE LOWER('@_McDonald%') ESCAPE '@'
注意,前一种方法将适用于子句,如,类似于和不类似于,但上述方法也适用于更强大的POSIX正则表达式,如~,~, !~, !~

在中,您还可以看到一些可能也有用的函数,例如
regexp\u replace
,您可以尝试在联系人姓名字段中转义特殊字符:

SELECT 
regexp_replace(contact_name, '([!$()*+.:<=>?[\\\]^{|}-])', '\\\1', 'g') 
FROM 
contacts 
WHERE
LOWER(contact_name) LIKE LOWER('_McDonald%') 
ORDER BY 
LOWER(contact_name) ASC LIMIT 1;
选择
regexp\u replace(联系人名称,”([!$()*+:?[\\\]^{{124;}-]),“\\\ 1”,“g”)
从…起
联络
哪里
较低的(联系人姓名)如较低的(“麦当劳%”)
订购人
下限(联系人姓名)ASC限制1;

例如,让我们假设联系人:麦当劳、\u麦当劳、\u麦当劳、麦当劳、麦当劳、麦当劳、麦当劳、麦当劳。我可能会搜索“\u M%”、“%\u%”、“%M%”、“M%”等。请确保区分通配符字符“%”和普通特殊字符“%”。