如何使用LIKE查询在PostgreSQL中查找字面百分号(%)?

35

我有一个表中包含 character varying 类型的条目,一些(不是全部)值包含百分比,例如:'12%''97%' 等等。我想找到所有包含百分比的值。换句话说,我想要找到所有以百分号结尾 ('%') 的值。


1
不要忘记下划线和反斜杠也需要转义。 - Flimm
3个回答

35
你可以尝试像这样做:
SELECT * FROM my_table  WHERE my_column LIKE '%\%%' ESCAPE '\';

格式

 <like predicate> ::=
      <match value> [ NOT ] LIKE <pattern>
        [ ESCAPE <escape character> ]

 <match value> ::= <character value expression>

 <pattern> ::= <character value expression>

 <escape character> ::= <character value expression>

3
如果您关闭了 standard_conforming_strings 选项(可以通过 show standard_conforming_strings; 进行检查),则需要双反斜杠: SELECT * FROM my_table WHERE my_column LIKE '%\\%%' ESCAPE '\\'; 而且在两种情况下(无论 standard_conforming_strings 如何),都可以使用带有双反斜杠的转义字符串语法: SELECT * FROM my_table WHERE my_column LIKE E'%\\%%' ESCAPE E'\\'; - Vsevolod Kulaga
1
但是当我使用PreparedStatement时会发生什么?谢谢。 - iseki
ESCAPE '\'子句的目的是什么?没有它查询也可以正常工作。 - Shiva
没有必要专门使用“\”。只要将任何ASCII字符放入转义子句中即可。 - JackHammer

20

你必须转义百分号。默认情况下,转义字符是反斜杠:

SELECT * FROM my_table  WHERE my_column LIKE '%\%';
在这种情况下,第一个 % 符号匹配 my_column 中的任何起始序列。其余的 \% 被解释为文字 % 字符。因此,它们的组合是:匹配以 % 字符结尾的任何内容。 SQLFiddle

4

我最终使用了正则表达式:

select * from my_table where my_column ~ '%$';

不过,我仍然想知道是否可以使用LIKE运算符/比较。


5
若要匹配下划线或百分号这样的特殊字符而不匹配其他字符,需在模式中将相应字符前面加上转义字符。具体来说,请参考此链接:http://www.postgresql.org/docs/current/static/functions-matching.html#FUNCTIONS-LIKE - user330315
@a_horse_with_no_name正在为PostgreSQL LIKE函数提供文档,但@magnus正在提供一种使用正则表达式匹配的解决方法,即~运算符;匹配(正则表达式)区分大小写,又称regexp_like...百分号在正则表达式模式中有特殊含义吗?我认为没有;所以不需要转义它,对吧?这就是@magnus这样做的原因;为了避免转义%,这很聪明。 - Nate Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接